我将MySQL与InnoDB引擎结合使用。我创建了一个包含外键的新表,例如:
CREATE TABLE rooms (
id INTEGER NOT NULL AUTO_INCREMENT,
my_id VARCHAR(15),
house_id INTEGER,
PRIMARY KEY (id),
FOREIGN KEY(house_id) REFERENCES houses (id) ON DELETE CASCADE
)
当我使用DB工具(如DBeaver )查看我的数据库和表的详细信息时,我看到我的外键house_id
缺少ON DELETE CASCADE
设置,而且外键house_id
似乎有2列条目。
DBeaver还显示了该表的DDL,如下所示:
CREATE TABLE `rooms` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`my_id` varchar(15) COLLATE utf8mb4_general_ci DEFAULT NULL,
`house_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `house_id` (`house_id`),
CONSTRAINT `rooms_ibfk_1` FOREIGN KEY (`house_id`) REFERENCES `houses` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
为什么DDL有额外的行KEY 'house_id' ('house_id').
?这条额外的行还会导致我的外键在我的house_id
表查看器中显示两个DBeaver列。如果我去掉这个,我的ON DELETE CASCADE
就会被正确设置。
我使用ORM,所以我无法控制CREATE TABLE
语句,所以我只是想至少了解这里发生了什么。
谢谢,
发布于 2020-01-15 13:59:02
来自MySQL关于外键约束的文档
MySQL需要对外键和引用键进行索引,这样外键检查就可以快速而不需要表扫描。在“引用”表中,必须有一个索引,其中将外键列按相同顺序列为第一列。如果引用表不存在,则自动在该表上创建这样的索引。
因为house_id
是在外键约束中使用的,而且它还没有索引,所以会自动添加索引。
我不认为DBeaver是两次展示专栏。它显示了列和索引,它们碰巧有相同的名称。
https://stackoverflow.com/questions/59760074
复制