MySQL外键约束不适用?

时间:2014-01-04 02:07:08

标签: mysql constraints

我有表PlayersPlayerMeta

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

有什么想法?感谢。

编辑:这是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 |

编辑(2):ID中的问题PlayerMeta已经是主键,而外键不会与其一起使用。

2 个答案:

答案 0 :(得分:2)

您无法为MyISAM创建外键。

只有InnoDB支持它们。

因此,您的解决方案是更改两个表的存储引擎。

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

然后在添加FK约束的情况下重新应用ALTER

答案 1 :(得分:0)

MySQL不允许您对列本身FOREIGN KEY创建PRIMARY KEY约束。如果您的设计是这两个表共享一对一关系并且都保存有关Player的信息,则将它们分开并将两个表合并为一个表可能没有意义。

在任何情况下,如果您希望将它们分开并对它们实施FOREIGN KEY关系,则需要删除PRIMARY KEY上的PlayerMeta.ID。您可能仍然拥有UNIQUE非主键索引。