mysql - 如何只导出MySQL外键

标签 mysql foreign-keys save export dump

有谁知道如何导出、转储数据库的所有外键? 我想修改字段并且外键有问题,所以我想删除所有外键并在完成更改后重新添加它们。

问候, 威廉

最佳答案

小心!

之前建议的解决方案有一些局限性。它们不适用于多列外键,并且当您使用诸如 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/

相关文章:

javascript - 如何使用 AJAX、PHP 和 MySQL 发送个人消息?

mysql - 如何将多个列中的 ID 替换为同一外部表中的相关数据?

php/mysql CI 每当我将数据插入子表时,它不会存储父表的 id

mysql - 在 mysql innodb 全文搜索上添加 "dot/period"字符作为可搜索词

javascript:将 <svg> 元素保存到磁盘上的文件

java - Hibernate:如何使用 CONCAT 和 GROUP_CONCAT

Mysql根据长度打印重复字符

ios - 如何处理(MyApp保存的文档)文件?

Mysql删除和优化很慢

java - 交换 Activity 时保存和加载联系人