MySQL CREATE TABLE在DDL语句中添加了额外的行

问题描述 投票:0回答:1

我正在将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
)

[当我使用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').?此额外的行还使我的外键在DBeaver表查看器中显示2 house_id列。如果我摆脱了这个,我的ON DELETE CASCADE将会正确设置。

我正在使用ORM,因此我无法控制CREATE TABLE语句,所以我只是想至少了解一下这里发生的事情。

谢谢,

python mysql innodb ddl
1个回答
1
投票

MySQL需要在外键和引用键上建立索引,以便外键检查可以快速进行,而无需进行表扫描。在引用表中,必须有一个索引,其中外键列以相同的顺序列为第一列。如果这样的索引不存在,则会在引用表上自动创建。

由于house_id用于外键约束,并且尚无索引,因此将自动添加索引。

我认为DBeaver不会两次显示该列。它显示列和索引,并且它们恰好具有相同的名称。

© www.soinside.com 2019 - 2024. All rights reserved.