【发布时间】:2020-07-28 16:55:14
【问题描述】:
我有一个包含这样的表的架构(简化):
-------- --------------- ------------
| key | | permission | | resource |
|------| |-------------| |----------|
| id | -----< | id | >----- | id |
| name | | key_id | | name |
-------- | resource_id | ------------
| action |
---------------
permission 表定义脚本是这样的:
CREATE TABLE `permission` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`key_id` INT(11) NOT NULL,
`resource_id` INT(11) NOT NULL,
`action` VARCHAR(32) NOT NULL,
PRIMARY_KEY (`id`),
CONSTRAINT `fk_permission_key` FOREIGN KEY (`key_id`) REFERENCES `key` (`id`),
CONSTRAINT `fk_permission_resource` FOREIGN KEY (`resource_id`) REFERENCES `resource` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
这一切都很好。然后,我决定我需要对 permission 表进行唯一约束,这样操作/键/资源组合只能存在一条记录,所以我这样做了:
ALTER TABLE `permission` ADD UNIQUE KEY `uq_permission` (`key_id`, `resource_id`, `action`);
这也很好用。我们处于使用迁移来管理架构更改的环境中,所以我想确保有一个“回滚”脚本。但是当我发出这个命令时:
ALTER TABLE `permission` DROP INDEX `uq_permission`;
我收到此错误:
1553 - 无法删除索引“uq_permission”:在外键中需要 约束
经过一番摸索,我发现如果我删除了外键fk_permission_key,我就可以删除唯一约束。
为什么我的唯一约束会与完全独立的外键纠缠在一起?
【问题讨论】:
-
创建另一个适合 FK 的索引(例如通过单独的列),然后删除您的索引。
-
这可能是一个错误。我最近报告了一个最终成为错误的行为。我建议,在 sql server 中尝试一下,看看它是否有效