В чем разница между этими двумя запросами SQL? - PullRequest
0 голосов
/ 28 октября 2011

Я создал таблицу Address с помощью этого SQL-запроса:

CREATE TABLE `address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Street` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Number` smallint(6) DEFAULT NULL,
  `other_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Но есть и такой запрос:

CREATE TABLE `address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Street` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Number` smallint(6) DEFAULT NULL,
  `other_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `other_id` (`other_id`),
  CONSTRAINT `adress_ibfk_1` FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci$$

и кажется, что запрос стенда создает идентичные таблицы.

Так может ли кто-нибудь объяснить мне, что делает эта строка:

KEY `other_id` (`other_id`),

и в чем разница между этими двумя строками:

  FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
and
  CONSTRAINT `adress_ibfk_1` FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

Если разница между двумя последними строками заключается в том, что последняя дает имя 'adress_ibfk_1' внешнему ключу? Если это правда - я должен это сделать? Я имею в виду, почему я должен называть внешние ключи? Мне когда-нибудь понадобятся их имена?

Спасибо! :)

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

KEY является синонимом INDEX, то есть создает индекс для столбца other_id.

Единственное отличие в конструкции внешнего ключа заключается в том, что последняя версия constraint позволяет вам назвать ограничение, тогда как первой будет присвоено имя, созданное системой.

Это имя можно увидеть в таблице INFORMATION_SCHEMA TABLE_CONSTRAINTS .

2 голосов
/ 28 октября 2011

MySQL интерпретирует KEY как индекс, поэтому второй запрос создает индекс для столбца other_id.

Разница между двумя декларациями FK заключается в том, что вы вручную задаете имя во второй строке,В первой строке MySQL автоматически устанавливает имя.
Им нужны имена, но вам не обязательно знать о них.Некоторые более продвинутые СУБД используют их для большей ясности, когда запрос вызывает ошибку.

...