通常我通过删除外键并重新创建它来更改表的更新和删除规则。示例如下:
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/