【问题标题】:Change only update and delete rule of a set of tables in MySQL仅更改 MySQL 中一组表的更新和删除规则
【发布时间】:2017-03-11 04:27:44
【问题描述】:

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

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;

我也试过了:

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

但它需要我无法提供的 root 权限。 请帮助如何做到这一点。

提前致谢

【问题讨论】:

  • 你在服务器上有权限这样做吗?也许您无权更新此表或根本无权更新表结构
  • 是的,我可以使用上面给出的基本 alter 命令进行更新
  • 我的意思是更新information_schema.referential_constraints
  • 不,我不愿意通过 root 用户或具有类似管理员权限的用户进行操作

标签: mysql alter-table


【解决方案1】:

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

例如,您可以遍历原始 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 ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多