Рассмотрим базу данных из двух простых таблиц: tablea
имеет INT id
, поле VARCHAR something
и ссылки tableb
(содержит одно и то же поле, но с добавлением UNIQUE).Производит ли MySQL индексы для ограничений UNIQUE и FOREIGN KEY неявно или я должен их явно создавать?
MySQL Workbench будет генерировать следующий код, если мы используем его для разработки и вперед-инженер этой схемы:
CREATE TABLE IF NOT EXISTS `tableb` (
`id` INT NOT NULL AUTO_INCREMENT,
`something` VARCHAR(45) NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `something_UNIQUE` (`something` ASC))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `tablea` (
`id` INT NOT NULL,
`something` VARCHAR(45) NULL,
`tableb_id` INT NOT NULL,
PRIMARY KEY (`id`, `tableb_id`),
INDEX `fk_tablea_tableb_idx` (`tableb_id` ASC),
CONSTRAINT `fk_tablea_tableb`
FOREIGN KEY (`tableb_id`)
REFERENCES `tableb` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
, но мы можем по-видимому достичь того же эффекта (ту же схему таблиц, столбцов и ограничений) с более простой, минималистичный код:
CREATE TABLE IF NOT EXISTS `tableb` (
`id` INT NOT NULL AUTO_INCREMENT,
`something` VARCHAR(45) NULL,
PRIMARY KEY (`id`),
UNIQUE (`something`)
) ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `tablea` (
`id` INT NOT NULL,
`something` VARCHAR(45) NULL,
`tableb_id` INT NOT NULL,
PRIMARY KEY (`id`, `tableb_id`),
FOREIGN KEY (`tableb_id`) REFERENCES `tableb`(`id`)
) ENGINE = InnoDB;
Действительно ли первая версия лучше (например, быстрее), чем вторая? Не будет ли MySQL создавать индексы, упомянутые в первой версии во втором случае?
Почему, по вашему мнению, MySQL автоматически индексирует столбец? –
для FK уверены в * ссылке *, если необходимо, на основе самого левого. Это можно увидеть после факта с 'show create table myTable'. В * ссылочном * no для FK в качестве попытки «ALTER TABLE» или создания дочернего элемента через «CREATE TABLE» будет просто сбой – Drew
Вам определенно необходимо определить его, например, если вы хотите использовать auto_increment, вы должны определить это тоже. MySQL-движок не читает, что вы думаете, вам нужно определить все параметры. Ура! – JoelBonetR