【问题标题】:Why does Mysql rename my foreign key?Mysql为什么要重命名我的外键?
【发布时间】:2014-10-19 18:44:59
【问题描述】:

为什么 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 - 知道为什么要这样做吗?

非常感谢,

肖恩

【问题讨论】:

  • 您没有提供外键约束的名称,因此 MYSQL 必须创建一个。您拥有的 FK_JOBS 是 FK 约束要使用的 index_name。

标签: mysql foreign-keys innodb


【解决方案1】:

您必须使用 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): Can't write;表“#sql-464_1”中的重复键。如果没有给出子句,或者 CONSTRAINT 关键字后面没有包含符号,则会自动创建约束名称。

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

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

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

【讨论】:

  • "这是 SQL 标准的一部分" - 索引根本不是 SQL 标准的一部分。只有约束和数据库中命名对象的规则。
  • @a_horse_with_no_name,是的,你是对的,我知道,但我没有准确表达。我已经编辑了上面的内容。
  • 哇。非常感谢比尔。我以为我用我的代码命名了外键。我曾认为 CONSTRAINT 关键字是选项。最好回到我的手册。再次感谢^_^
猜你喜欢
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多