如何仅导出MySQL外键

Wil*_*ier 2 mysql export dump foreign-keys save

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

问候,威廉

Eda*_*Eda 6

当心!

以前建议的解决方案有一些限制。它们不适用于多列外键,并且当您使用一些有问题的词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 中重命名它们以重新添加这些外键。


Ger*_*rvs 5

之前:

SET FOREIGN_KEY_CHECKS = 0;
Run Code Online (Sandbox Code Playgroud)

完成后:

SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)


Wil*_*ier 4

我找到了一个解决方案,

  • 一条 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

我希望它可以帮助别人^^威廉