mysql - 仅更改 MySQL 中一组表的更新和删除规则

标签 mysql alter-table

通常我通过删除外键并重新创建它来更改表的更新和删除规则。示例如下:

ALTER TABLE xyz DROP FOREIGN KEY fk_1;

ALTER TABLE xyz ADD CONSTRAINT fk_1 FOREIGN KEY (a) REFERENCES batch_details a) ON DELETE CASCADE ON UPDATE CASCADE;

但是,如果我有一组表格,那么这样做就很乏味了。 虽然我可以使用

查看所有表的更新和删除规则

select * from information_schema.referential_constraints;

我也试过:

更新 information_schema.referential_constraints set update_rule='CASCADE',delete_rule='CASCADE' where table_name='x';

但它想要我无法授予的 root 权限。 请帮助如何做到这一点。

提前致谢

最佳答案

我的建议是创建一组管理存储过程,您可以重复使用这些过程来执行这些操作,然后调用这些过程——无论是在外部过程的循环中,还是从脚本中。

例如,您可以遍历原始 information_schema SELECT 查询的结果(可能在过程中使用游标),然后调用新的管理过程每行返回。

这是一个可用于删除外键的管理存储过程。您可以使用相同的原则来创建用于添加约束的类似过程。

DROP PROCEDURE IF EXISTS `admin_drop_fk`;

DELIMITER $$

CREATE PROCEDURE `admin_drop_fk`(
    fk_name VARCHAR(64),    
    table_name VARCHAR(64),
    db_name  VARCHAR(64)
)
BEGIN
SET @sqlexec := 
CONCAT
(
    'SELECT @i := COUNT(*) FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_NAME = \'',
    fk_name, 
    '\' AND TABLE_NAME = \'', 
    table_name,
    '\' AND TABLE_SCHEMA = \'',
    db_name,
    '\''
);

SELECT CONCAT('Executing: "', @sqlexec, '"') AS 'Info';
PREPARE lookup FROM @sqlexec;
EXECUTE lookup;
DEALLOCATE PREPARE lookup;

IF @i > 0 THEN
    SET @sqlexec := CONCAT('ALTER TABLE `', db_name, '`.`', table_name, '` DROP FOREIGN KEY `', fk_name, '`');
    SELECT CONCAT('Executing: "', @sqlexec, '"') AS 'Info';
    PREPARE statement FROM @sqlexec;
    EXECUTE statement;
    DEALLOCATE PREPARE statement;
    SELECT CONCAT('Successful execution of: "', @sqlexec, '"') AS 'Info';
ELSE
    SELECT CONCAT('Warning: Foreign key `', fk_name, '` does not exist on `', db_name, '`.`', table_name, '`') AS 'Warning';
END IF;

END$$

DELIMITER ;

关于mysql - 仅更改 MySQL 中一组表的更新和删除规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40302364/

相关文章:

snowflake-cloud-data-platform - 雪花外部表 : Add new column

MySQL:ALTER IGNORE TABLE ADD UNIQUE,什么会被截断?

sql - 运行时错误 2465 找不到带有更改列的字段 '|1'

mysql - 对mysql结果的 bool 运算

mysql - 内连接问题

php - 显示来自 php 文件的图像(存储在 mysql 数据库中)

php - 如何在 mysql 的时间数据类型字段中插入 am pm?

mysql - 从多个表更新什么 SQL 查询?

MySQL ALTER 列到表中的最后一个位置

MySQL删除外键错误152