2014-01-04 4 views
0

У меня есть таблицы Players и PlayerMetaОграничение внешнего ключа MySQL не применяется?

mysql> DESCRIBE Players; 
+-------------+-------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-------------+-------------+------+-----+---------+----------------+ 
| ID   | int(5)  | NO | PRI | NULL | auto_increment | 
| PlayerName | varchar(20) | NO | PRI | NULL |    | 
| Birthdate | date  | YES |  | NULL |    | 
| Location | varchar(20) | YES |  | NULL |    | 
| FirstName | varchar(15) | YES |  | NULL |    | 
| Whitelisted | tinyint(1) | NO |  | 1  |    | 
+-------------+-------------+------+-----+---------+----------------+ 

mysql> DESCRIBE PlayerMeta; 
+----------------+------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+----------------+------------+------+-----+---------+-------+ 
| ID    | int(5)  | NO | PRI | NULL |  | 
| JoinDate  | date  | YES |  | NULL |  | 
| BuildQuota  | int(2)  | NO |  | 2  |  | 
| RegisteredDate | date  | YES |  | NULL |  | 
| HideBirthdate | tinyint(1) | NO |  | 0  |  | 
+----------------+------------+------+-----+---------+-------+ 

Я пытаюсь выполнить эту команду, и она возвращает Query OK:

ALTER TABLE PlayerMeta 
ADD CONSTRAINT fk_PlayerID 
FOREIGN KEY (ID) 
REFERENCES Players(ID) 
ON UPDATE CASCADE 
ON DELETE CASCADE; 

Тем не менее, когда я бегу SHOW CREATE TABLE PlayerMeta, он не показывает ограничение , а также нет в INFORMATION_SCHEMA

Любые мысли? Благодарю.

EDIT: Вот SHOW CREATE TABLE PlayerMeta:

mysql> SHOW CREATE TABLE PlayerMeta; 
... a bunch of lines ... 
| PlayerMeta | CREATE TABLE `PlayerMeta` (
    `ID` int(5) NOT NULL, 
    `JoinDate` date DEFAULT NULL, 
    `BuildQuota` int(2) NOT NULL DEFAULT '2', 
    `RegisteredDate` date DEFAULT NULL, 
    `HideBirthdate` tinyint(1) NOT NULL DEFAULT '0', 
    UNIQUE KEY `ID` (`ID`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 

EDIT (2): Проблема была ID в PlayerMeta уже первичный ключ и внешний ключ не будет применяться в сочетании с ним.

+0

Итак, покажите нам 'SHOW CREATE TABLE' – zerkms

+0

Успешно ли выполнена команда? У вас были ошибки? вы обновили после создания ограничения ??? –

+1

@ M.Ali: "и он возвращает запрос ОК:". PS: «вы обновили после создания ограничения» - что это означает? – zerkms

ответ

0

MySQL не позволит вам создать ограничение FOREIGN KEY на столбец, который сам является PRIMARY KEY. Если ваш проект таков, что две таблицы разделяют взаимно однозначные отношения, и оба содержат информацию о Player, может не иметь смысла их разделять и вместо этого объединить обе таблицы в одну.

В любом случае, если вы хотите, чтобы они не разделяли и не применяли к ним отношения FOREIGN KEY, вам необходимо удалить PRIMARY KEY по телефону PlayerMeta.ID. У вас может быть еще UNIQUE, индекс не первичного ключа.

+0

Он не объясняет, и он возвращает запрос «ОК». В то время как ** ** возможно иметь столбец как ПК и FK одновременно. Я просто создал его без каких-либо проблем. Я понятия не имею, как это может быть ответ. http://pastebin.com/FfH7b5dt – zerkms

+0

@sibble, вы должны не понимать это, поэтому я могу удалить его. Это неверно. –

2

Вы не можете создавать внешние ключи для MyISAM.

Только InnoDB поддерживает их.

Итак, решение для вас - это изменить механизм хранения для обеих таблиц.

ALTER TABLE Players ENGINE=InnoDB; 
ALTER TABLE PlayerMeta ENGINE=InnoDB; 

Затем повторно применить ваши ALTER с добавлением ограничения FK.

+0

Вы можете создать их в MyISAM, но я не верю в силу. –

+0

Интересно. Я сделал, как @MichaelBerkowski предложил выше об удалении первичного ключа из 'ID' в' PlayerMeta', а внешний ключ был применен отлично. – sbl03

+0

@Michael Berkowski: Я так сомневаюсь, что http://dev.mysql.com/doc/refman/5.6/en/myisam-storage-engine.html – zerkms

Смежные вопросы