0

我正在使用带有 InnoDB 引擎的 MySQL。我创建一个包含外键的新表,例如:

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

我正在使用 ORM,所以我无法控制CREATE TABLE语句,所以我只是想至少了解这里发生了什么。

谢谢,

4

1 回答 1

1

从关于外键约束的 MySQL 文档:

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

由于house_id在外键约束中使用,并且它还没有索引,因此会自动添加索引。

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

于 2020-01-15T21:59:02.957 回答