2010-01-20 1 views
4

Я использовал MySQL Workbench для подготовки макета базы данных и экспортировал его в мою базу данных с помощью phpMyAdmin. При взгляде на одну таблице, я получил следующее предупреждение:Ключи PRIMARY и INDEX для одного столбца FOREIGN в MySQL

ПЕРВИЧНЫХ и INDEX ключи не должны быть заданы для столбца gid

gid является иностранным индексом, который является первичным ключом другой таблицы , и который также является частью первичного ключа текущей таблицы. Поэтому я имею это как часть первичного ключа, а Workbench создал индекс для ввода внешнего ключа. Итак, почему это предупреждение появляется, следует ли игнорировать его или пересмотреть мой макет базы данных?

Это очень упрощенный пример используемой структуры, которая производит предупреждение:

CREATE TABLE IF NOT EXISTS `test_groups` (
    `gid` INT NOT NULL , 
    `gname` VARCHAR(45) NULL , 
    PRIMARY KEY (`gid`)); 

CREATE TABLE IF NOT EXISTS `test_users` (
    `gid` INT NOT NULL , 
    `uid` INT NOT NULL , 
    `name` VARCHAR(45) NULL , 
    PRIMARY KEY (`gid`, `uid`) , 
    INDEX `gid` (`gid` ASC) , 
    CONSTRAINT `gid` 
    FOREIGN KEY (`gid`) 
    REFERENCES `test_groups` (`gid`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

редактировать Я попытался удалить дополнительный индекс для gid в PhpMyAdmin и, кажется, работает. Каскадное действие по-прежнему происходит при изменении чего-либо в таблице групп, поэтому я полагаю, что внешнее отношение не повреждено даже без индекса.

Но почему MySQL Workbench заставляет меня поддерживать этот индекс? Я не могу вручную удалить его там, пока есть внешний ключ.

ответ

0

Я решил эту проблему сейчас. Похоже, что механизм хранения базы данных по умолчанию был установлен на MyISAM на моем сервере, поэтому, поскольку я не указал его явно, все отношения с внешним ключом просто отбрасывались (не говоря уже об этом). После преобразования его в InnoDB я больше не получаю предупреждение, поэтому кажется, что все работает так, как должно.

Однако в этом специальном случае я буду придерживаться MyISAM и оставим внешние внешние отношения на данный момент, потому что я хочу, чтобы автоматически увеличивать второй атрибут в этой многокнопочной (и это не поддерживается InnoDB) , и это немного более полезно для этого приложения, чем наличие внешних ключей (особенно когда данные, в которых обновление и удаление будут выполняться очень редко).

Также в отношении Workbench MySQL это поведение по-прежнему выглядит немного ошибкой, и оно уже было reported.

+0

Эта ошибка неправильно помечена как дубликат некоторой другой исправленной ошибки. [Это актуальная ошибка.] (Http://bugs.mysql.com/bug.php?id=53277) – phazei

2

В этом нет ничего плохого. Даже если это был весь первичный ключ текущей таблицы, он по-прежнему потенциально правильный. В самом деле, если вы не один из тех «программистов», которые только когда-либо используют столбцы автоинкремента для первичных ключей, вы увидите, что это много сообщает.

+0

Итак, правильно ли создается дополнительный индекс для внешнего ключа? И извините, но я не получу вторую часть вашего ответа. – poke

+0

Извините, я предположил, что проблема связана с наличием поля как основного, так и внешнего ключа. Да, второй индекс избыточен, mysql с радостью использует индекс первичного ключа, чтобы возвращать строки, заданные «gid». Это будет очень немного менее эффективно, но вы никогда не сможете измерить разницу. C. – symcbean