繁体   English   中英

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

[英]Why does Mysql rename my foreign key?

为什么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的外键重命名为JOB_LISTENER_ibfk_4 - 为什么会这样做?

非常感谢,

肖恩

您必须使用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符号子句,则符号值(如果使用)在数据库中必须是唯一的。 重复的符号将导致类似于以下的错误:ERROR 1022(2300):无法写入; 表'#sql-464_1'中的重复键。 如果未给出该子句,或者CONSTRAINT关键字后面不包含符号,则会自动创建约束的名称。

有时您必须在两行之间阅读。 在上面的段落中,我从最后一句中推断出必须使用CONSTRAINT关键字为约束命名,因为如果不这样做,则会自动创建约束名称。

提示:请注意,约束名称在数据库中必须是唯一的,而不仅仅是在表中。 举个例子,这是SQL标准的一部分。 所以你可能没想到这一点,所以要小心不要使用重复的约束名称。

而在某些实现中,您可以在同一数据库中的多个表中使用相同的索引名称(SQL标准不包括索引实现,因为a_horse_with_no_name提醒我)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM