gpt4 book ai didi

sql - MySQL 条件删除外键脚本

转载 作者:行者123 更新时间:2023-11-29 01:47:54 25 4
gpt4 key购买 nike

我参与的是一个将一个项目从Oracle迁移到MySQL的项目。我有一个从 MySQL shell 命令运行的脚本,称为 CreateTables.sql,内部看起来像这样:

source table\DropForeignKeys.sql
source tables\Site.sql
source tables\Language.sql
source tables\Country.sql
source tables\Locale.sql
source tables\Tag.sql

mysql --user=root --password --database=junkdb -vv < CreateTables.sql

我所追求的是一种方法,使第一个脚本 DropForeignKeys.sql 的执行有条件地基于数据库是否有任何表。或者,如果有一种方法可以在不存在约束的情况下删除约束,但据我所知,MySQL 中不存在这样的构造,那就太好了。

所以我的问题是如何在脚本级别或约束级别使外键约束的删除成为条件,以便我可以获得可靠的可重播脚本?

最佳答案

What I'm after is a way to make the execution for the first script DropForeignKeys.sql conditional based on if the db has any tables of not.

条件逻辑 (IF/ELSE) 仅在函数和存储过程中受支持 - 您必须使用类似于以下内容的内容:

DELIMITER $$

DROP PROCEDURE IF EXISTS upgrade_database $$
CREATE PROCEDURE upgrade_database()
BEGIN

-- INSERT NEW RECORD IF PREEXISTING RECORD DOESNT EXIST
IF((SELECT COUNT(*) AS column_exists
FROM information_schema.columns
WHERE table_name = 'test'
AND column_name = 'test7') = 0) THEN
ALTER TABLE test ADD COLUMN `test7` int(10) NOT NULL;
UPDATE test SET test7 = test;
SELECT 'Altered!';
ELSE
SELECT 'Not altered!';
END IF;
END $$

DELIMITER ;
CALL upgrade_database();

除了引用 INFORMATION_SCHEMA.COLUMNS,您还可以引用 INFORMATION_SCHEMA.KEY_COLUMN_USAGE .

根据您的需要:

ALTER TABLE [table name] DISABLE KEYS 
ALTER TABLE [table name] ENABLE KEYS

...将禁用并重新启用附加到该表的 key ,而无需知道每个 key 。您可以使用 SET foreign_key_checks = 0; 禁用和启用数据库级别的 key ,使用 SET foreign_key_checks = 1; 启用它们。

It surprises me that MySQL doesn't seem to have a better way of dealing with this common scripting problem.

Oracle 也没有,但约束并不是您想要在不了解细节的情况下盲目改变的东西。

The reason I need the drop foreign keys script is because drop table yields an error when their are FK attachments. Will disabling FK checks allow for me to drop the tables?

是的,删除或禁用约束将允许您删除表,但请注意 - 为了重新启用 fk 检查,您需要父表中的数据与子表中的现有数据相匹配。

关于sql - MySQL 条件删除外键脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1981428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com