Wil*_*ier 2 mysql export dump foreign-keys save
有谁知道如何导出,转储数据库的所有外键?我想修改字段,外键是有问题的,所以我想删除所有外键,并在更改完成后重新添加它们。
问候,威廉
当心!
以前建议的解决方案有一些限制。它们不适用于多列外键,并且当您使用一些有问题的词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;
Run Code Online (Sandbox Code Playgroud)
添加所有 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;
Run Code Online (Sandbox Code Playgroud)
最后一个注意事项:如果您想重命名某些列,请不要忘记在该 SQL 中重命名它们以重新添加这些外键。
之前:
SET FOREIGN_KEY_CHECKS = 0;
Run Code Online (Sandbox Code Playgroud)
完成后:
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)
我找到了一个解决方案,
一条 SQL 用于保存所有 FK :
SELECT CONCAT('ALTER TABLE', tb1.TABLE_NAME, '添加约束', tb1.CONSTRAINT_NAME, '外键(', tb1.COLUMN_NAME, ')引用', tb1.REFERENCED_TABLE_NAME, '(', tb1.REFERENCED_COLUMN_NAME, ') ON DELETE ', tb2.DELETE_RULE, ' ON UPDATE ', tb2.UPDATE_RULE, ';') FROM information_schema。KEY_COLUMN_USAGEAS tb1 INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS AS tb2 ON tb1.CONSTRAINT_NAME = tb2.CONSTRAINT_NAME WHERE table_schema = 'sfa' AND referenced_column_name IS NOT NULL
和一条删除所有 FK 的 SQL:
SELECT CONCAT('alter table', tb1.TABLE_NAME, '删除外键', tb1.CONSTRAINT_NAME, ';') FROM information_schema。KEY_COLUMN_USAGEAS tb1 INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS AS tb2 ON tb1.CONSTRAINT_NAME = tb2.CONSTRAINT_NAME WHERE table_schema = 'sfa' AND referenced_column_name IS NOT NULL
我希望它可以帮助别人^^威廉
| 归档时间: |
|
| 查看次数: |
2462 次 |
| 最近记录: |