MySQL CREATE TABLE добавляет дополнительную строку в оператор DDL - PullRequest
0 голосов
/ 16 января 2020

Я использую 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').? Эта дополнительная строка также заставляет мой внешний ключ показывать 2 house_id столбца в моей программе просмотра таблиц DBeaver. Если я избавлюсь от этого, мой ON DELETE CASCADE будет установлен правильно.

Я использую ORM, поэтому у меня нет контроля над оператором CREATE TABLE, поэтому я просто пытаюсь хотя бы понять, что здесь происходит.

Спасибо,

1 Ответ

1 голос
/ 16 января 2020

Из MySQL документации по Ограничения внешнего ключа :

MySQL требуются индексы для внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требуется сканирование таблицы. В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке. Такой индекс создается в ссылочной таблице автоматически, если он не существует.

Поскольку house_id используется в ограничении внешнего ключа, и у него еще нет индекса, индекс добавлено автоматически.

Я не думаю, что DBeaver показывает столбец дважды. Он показывает столбец и индекс, и у них одно и то же имя.

...