仅在其存在时删除外键。
如果您想要在外键存在的情况下删除外键,并且不想使用存储过程,您可以按照以下方式进行操作(针对MySQL):
set @stmt = if((SELECT true FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE() AND TABLE_NAME = 'table_name' AND CONSTRAINT_NAME = 'fk_name' AND CONSTRAINT_TYPE = 'FOREIGN KEY') = true,'ALTER TABLE table_name drop foreign key fk_name','select 1'); prepare stmt from @stmt; execute stmt; deallocate prepare stmt;
如果有外键存在,则将alter table语句放入变量中;如果没有外键存在,则放入一个虚拟语句。然后执行该语句。
这种方法的原因是,有时候我们希望在删除外键时检查外键是否存在,以避免出现错误。通过使用信息模式(information schema)中的表约束信息,我们可以判断指定的外键是否存在。如果存在,我们执行ALTER TABLE语句来删除外键;如果不存在,我们执行一个虚拟语句(select 1)来避免错误。这样,无论外键是否存在,我们都可以安全地执行操作。
希望这篇文章对您有帮助!
当你创建一个外键约束时,MySQL会自动在引用的列上创建一个索引。上面的示例显示了如何在INFORMATION_SCHEMA中检查索引,但是在information schema中还有更多信息可供查阅。你的索引名称似乎表明它是为一个外键创建的,所以你需要先删除外键,然后再删除索引。如果你再次创建外键,MySQL会再次创建索引。它需要一个索引来强制实施引用完整性,而不需要进行表扫描。
如果你的意图是创建一个包含相同列的新索引,你需要先创建该索引(列作为索引指定的列列表中的第一个列)。现在你可以重新添加外键,MySQL将愉快地使用新索引而不创建另一个索引。
编辑:要快速查看索引,只需执行SHOW INDEXES FROM myTable;
为了提高可重用性,你确实希望使用存储过程。在所需的数据库上运行以下代码:
DROP PROCEDURE IF EXISTS PROC_DROP_FOREIGN_KEY; DELIMITER $$ CREATE PROCEDURE PROC_DROP_FOREIGN_KEY(IN tableName VARCHAR(64), IN constraintName VARCHAR(64)) BEGIN IF EXISTS( SELECT * FROM information_schema.table_constraints WHERE table_schema = DATABASE() AND table_name = tableName AND constraint_name = constraintName AND constraint_type = 'FOREIGN KEY') THEN SET @sql = CONCAT('ALTER TABLE ', tableName, ' DROP FOREIGN KEY ', constraintName, ';'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; END$$ DELIMITER ;
然后,你可以始终将这个语句:
ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`;
替换为这个语句:
CALL PROC_DROP_FOREIGN_KEY('object', 'object_ibfk_1');
无论`object_ibfk_1`是否存在,你的脚本都应该正常运行。
参考链接:[http://simpcode.blogspot.com.ng/2015/03/mysql-drop-foreign-key-if-exists.html](http://simpcode.blogspot.com.ng/2015/03/mysql-drop-foreign-key-if-exists.html)