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

标签 mysql foreign-keys innodb

为什么 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说:

If the CONSTRAINT symbol clause is given, the symbol value, if used, must be unique in the database. A duplicate symbol will result in an error similar to: ERROR 1022 (2300): Can't write; duplicate key in table '#sql- 464_1'. If the clause is not given, or a symbol is not included following the CONSTRAINT keyword, a name for the constraint is created automatically.

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

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

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

关于mysql - 为什么 Mysql 重命名我的外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25505861/

相关文章:

mysql - 如何在mysql中加载数据时解决这个错误?

mysql - 可选外键

mysql - 奇怪的行为优化查询索引(MariaDB + InnoDB)

php - 如何编辑 Paypal 沙箱的输入字段?

mysql - SQL SELECT 表中的多个数据并计算

java - 在 INSERT 语句之后选择?

python - Django 外键查询集(加入)

mysql - ID 引用表而不是表中的列

mysql - 如何为仅包含 ibdata 和 *.ibd 文件的 MySQL InnoDB 表重新创建 FRM 文件?

MySQL group by 会破坏查询性能