有谁知道如何导出、转储数据库的所有外键? 我想修改字段并且外键有问题,所以我想删除所有外键并在完成更改后重新添加它们。
问候, 威廉
最佳答案
小心!
之前建议的解决方案有一些局限性。它们不适用于多列外键,并且当您使用诸如 order
(这很常见)之类的有问题的词命名列或表时,它们也会崩溃。
所以我试图修复它们。这应该是完全可用的 SQL,它正确地引用表和列并支持多列 FK:
删除所有 FK:
SELECT CONCAT(
'ALTER TABLE `', kcu.TABLE_NAME, '` ',
'DROP FOREIGN KEY `', kcu.CONSTRAINT_NAME, '`;'
)
FROM information_schema.KEY_COLUMN_USAGE AS kcu
INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS AS rc ON
kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME AND
kcu.TABLE_SCHEMA = rc.CONSTRAINT_SCHEMA
WHERE
kcu.TABLE_SCHEMA = 'your_database_name_here' AND
kcu.REFERENCED_COLUMN_NAME IS NOT NULL
GROUP BY
kcu.TABLE_NAME,
kcu.CONSTRAINT_NAME;
添加所有 FK:
SELECT CONCAT(
'ALTER TABLE ', fks.quotedSourceTableName, ' ',
'ADD CONSTRAINT ', fks.quotedConstraintName, ' ',
'FOREIGN KEY (', GROUP_CONCAT(fks.quotedSourceColumnName), ') ',
'REFERENCES ', fks.quotedTargetTableName, ' (',
GROUP_CONCAT(fks.quotedTargetColumnName),
') ',
'ON DELETE ', fks.deleteRule, ' ',
'ON UPDATE ', fks.updateRule, ';'
)
FROM (
SELECT
CONCAT('`', kcu.CONSTRAINT_NAME, '`') AS quotedConstraintName,
CONCAT('`', kcu.TABLE_NAME, '`') AS quotedSourceTableName,
CONCAT('`', kcu.COLUMN_NAME, '`') AS quotedSourceColumnName,
CONCAT('`', kcu.REFERENCED_TABLE_NAME, '`') AS quotedTargetTableName,
CONCAT('`', kcu.REFERENCED_COLUMN_NAME, '`') AS quotedTargetColumnName,
rc.DELETE_RULE AS deleteRule,
rc.UPDATE_RULE AS updateRule
FROM information_schema.KEY_COLUMN_USAGE AS kcu
INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS AS rc ON
kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME AND
kcu.TABLE_SCHEMA = rc.CONSTRAINT_SCHEMA
WHERE
kcu.TABLE_SCHEMA = 'your_database_name_here' AND
kcu.REFERENCED_COLUMN_NAME IS NOT NULL
ORDER BY
kcu.ORDINAL_POSITION DESC
) AS fks
GROUP BY
fks.quotedConstraintName,
fks.quotedSourceTableName,
fks.quotedTargetTableName,
fks.deleteRule,
fks.updateRule;
最后一点:如果您想重命名某些列,请不要忘记在该 SQL 中也重命名它们以重新添加这些外键。
关于mysql - 如何只导出MySQL外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28091003/