仅在其存在时删除外键。

13 浏览
0 Comments

仅在其存在时删除外键。

我使用的是MySQL数据库。

我正在做这个操作,但是它不起作用。

ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`;

我已经尝试在各个位置加上了IF EXISTS。如何在删除之前检查外键是否存在?

0
0 Comments

如果您想要在外键存在的情况下删除外键,并且不想使用存储过程,您可以按照以下方式进行操作(针对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)来避免错误。这样,无论外键是否存在,我们都可以安全地执行操作。

希望这篇文章对您有帮助!

0
0 Comments

当你创建一个外键约束时,MySQL会自动在引用的列上创建一个索引。上面的示例显示了如何在INFORMATION_SCHEMA中检查索引,但是在information schema中还有更多信息可供查阅。你的索引名称似乎表明它是为一个外键创建的,所以你需要先删除外键,然后再删除索引。如果你再次创建外键,MySQL会再次创建索引。它需要一个索引来强制实施引用完整性,而不需要进行表扫描。

如果你的意图是创建一个包含相同列的新索引,你需要先创建该索引(列作为索引指定的列列表中的第一个列)。现在你可以重新添加外键,MySQL将愉快地使用新索引而不创建另一个索引。

编辑:要快速查看索引,只需执行SHOW INDEXES FROM myTable;

0
0 Comments

为了提高可重用性,你确实希望使用存储过程。在所需的数据库上运行以下代码:

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)

0