为什么Mysql会重命名我的外键?

4
为什么Mysql/InnoDB似乎会改名我创建的一些外键?
例如:
mysql> alter table JOB_LISTENER add foreign key FK_JOBS (job_id) REFERENCES job(id);
mysql>
mysql> show create table JOB_LISTENER;
snip> ....
mysql> CONSTRAINT `JOB_LISTENER_ibfk_4` FOREIGN KEY (job_id) REFERENCES job (id)
snip> ....

我创建的外键名为FK_JOBS,但it将其重命名为JOB_LISTENER_ibfk_4 - 有什么想法吗?

非常感谢,

Sean


5
你没有为外键约束提供名称,因此MYSQL不得不创建一个。你现在拥有的 FK_JOBS 是该外键约束要使用的索引名称。 - ypercubeᵀᴹ
1个回答

3

您必须使用CONSTRAINT关键词来命名约束:

mysql> ALTER TABLE JOB_LISTENER ADD CONSTRAINT FK_JOBS FOREIGN KEY (job_id) 
  REFERENCES job(id);

如果需要创建索引,则此操作会自动将索引命名为相同的名称。

mysql> SHOW CREATE TABLE JOB_LISTENER\G
*************************** 1. row ***************************
       Table: JOB_LISTENER
Create Table: CREATE TABLE `JOB_LISTENER` (
  `job_id` int(11) DEFAULT NULL,
  KEY `FK_JOBS` (`job_id`),
  CONSTRAINT `FK_JOBS` FOREIGN KEY (`job_id`) REFERENCES `job` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html上写道:

如果提供了 CONSTRAINT symbol 子句,则如果使用该符号值,它必须在数据库中是唯一的。重复的符号会导致类似以下错误:ERROR 1022 (2300): Can't write; duplicate key in table '#sql-464_1'。如果未提供该子句或在 CONSTRAINT 关键字后未包括符号,则会自动创建一个约束名称。

有时候你需要看懂行间的隐含意思。在上面的段落中,我从最后一句推断出,你必须使用 CONSTRAINT 关键字来为约束命名,因为如果你不这样做,约束名称会被自动创建。

提示:请注意,约束名称必须在整个数据库内是唯一的,而不仅仅是在表内唯一。怎么想都不应该呢,这是 SQL 标准的一部分。所以你不应该使用重复的约束名称,要小心。

但是,在某些实现中,你可以在同一数据库的多个表中使用相同的索引名称(SQL 标准不涉及索引实现,正如 a_horse_with_no_name 所提醒的那样)。


索引根本不是SQL标准的一部分。只有约束和数据库中对象命名规则是其标准的一部分。这是 SQL 标准的一部分 - user330315
@a_horse_with_no_name,是的,你说得对,我知道,但是我没有表达得很准确。我已经编辑了上面的内容。 - Bill Karwin
哇,太感谢了Bill。我原以为我已经用我的代码命名了外键。我还以为CONSTRAINT关键字是可选的。最好回去看看我的手册。再次感谢 ^_^ - Seani Wild

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接