外键导致我修改数据库结构以满足新要求时出现太多问题 - 我想修改主键但是当外键引用有问题的表时我似乎不能(我认为因为MySQL删除了表并重新创建) ).
因此,当我处理数据库时,我想简单地删除所有外键并在以后重新创建它们.这样做有一个简洁的方法吗?
Zoo*_*ozy 55
跑
SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';')
FROM information_schema.key_column_usage
WHERE CONSTRAINT_SCHEMA = 'db_name'
AND referenced_table_name IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
并运行输出.
Mik*_*ant 37
您可以在要创建的任何Alter Table语句之前发出以下命令:
SET foreign_key_checks = 0;
Run Code Online (Sandbox Code Playgroud)
这将关闭数据库连接的外键约束检查.然后,您可以进行更改,而无需担心约束.
完成后,不要忘记发出:
SET foreign_key_checks = 1;
Run Code Online (Sandbox Code Playgroud)
把它们重新打开.
请注意,这仍然不允许您创建因列数据类型不匹配而失败的新外键约束.
小智 5
另一个版本的Zoozy代码,在这里您只能选择一个表:
SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';')
FROM information_schema.key_column_usage
WHERE CONSTRAINT_SCHEMA = 'YOUR DB HERE'
AND TABLE_NAME='YOUR TABLE HERE'
AND REFERENCED_TABLE_NAME IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
还有一个程序:
DROP PROCEDURE IF EXISTS dropForeignKeysFromTable;
delimiter ///
create procedure dropForeignKeysFromTable(IN param_table_schema varchar(255), IN param_table_name varchar(255))
begin
declare done int default FALSE;
declare dropCommand varchar(255);
declare dropCur cursor for
select concat('alter table ',table_schema,'.',table_name,' DROP FOREIGN KEY ',constraint_name, ';')
from information_schema.table_constraints
where constraint_type='FOREIGN KEY'
and table_name = param_table_name
and table_schema = param_table_schema;
declare continue handler for not found set done = true;
open dropCur;
read_loop: loop
fetch dropCur into dropCommand;
if done then
leave read_loop;
end if;
set @sdropCommand = dropCommand;
prepare dropClientUpdateKeyStmt from @sdropCommand;
execute dropClientUpdateKeyStmt;
deallocate prepare dropClientUpdateKeyStmt;
end loop;
close dropCur;
end///
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25819 次 |
| 最近记录: |