MySQL - 添加约束一次添加两次不同的情况

Posted

技术标签:

【中文标题】MySQL - 添加约束一次添加两次不同的情况【英文标题】:MySQL - adding constraint once adds it twice with diffent case 【发布时间】:2013-08-15 04:17:12 【问题描述】:

当我向 mysql 表添加约束时,我有这种奇怪的行为:

[...] add constraint qrtz_blob_triggers_ibfk_1 foreign key [...]

现在 SHOW CREATE TABLE 显示约束两次:

CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY [...]
CONSTRAINT `QRTZ_BLOB_TRIGGERS_ibfk_1` FOREIGN KEY [...]

这是完整的会话:

mysql> DROP DATABASE IF EXISTS my_test; CREATE DATABASE my_test 默认字符集 utf8 collat​​e utf8_bin; 查询正常,2 行受影响(0.07 秒) 查询正常,1 行受影响(0.00 秒) mysql> 使用 my_test; 数据库已更改 mysql> mysql> DROP TABLE IF EXISTS `QRTZ_TRIGGERS`; 查询正常,0 行受影响,1 个警告(0.00 秒) mysql> mysql> 创建表`QRTZ_TRIGGERS` ( `TRIGGER_NAME` varchar(80) NOT NULL, `TRIGGER_GROUP` varchar(80) 非空, 主键(`TRIGGER_NAME`、`TRIGGER_GROUP`) ) 引擎=InnoDB 默认字符集=utf8; 查询正常,0 行受影响(0.08 秒) mysql> mysql> DROP TABLE IF EXISTS `QRTZ_BLOB_TRIGGERS`; 查询正常,0 行受影响,1 个警告(0.00 秒) mysql> mysql> 创建表 `QRTZ_BLOB_TRIGGERS` (`TRIGGER_NAME` varchar(80) not null, `TRIGGER_GROUP` varchar(80) not null, `BLOB_DATA` longblob, 主键 (`TRIGGER_NAME`, `TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET =utf8; 查询正常,0 行受影响(0.08 秒) mysql> mysql> 改变表 `QRTZ_BLOB_TRIGGERS` 添加索引 qrtz_blob_triggers_ibfk_1 (`TRIGGER_NAME`, `TRIGGER_GROUP`), 添加约束 qrtz_blob_triggers_ibfk_1 外键 (`TRIGGER_NAME`, `TRIGGER_GROUP`) 引用`QRTZ_TRIGGERS` (`TRIGGER_NAME`, `TRIGGER_GROUP`) ON UPDATE删除限制; 查询正常,0 行受影响(0.18 秒) 记录:0 重复:0 警告:0 mysql> mysql> 显示创建表 QRTZ_BLOB_TRIGGERS \G ****************************** 1. 行 ************************ ******* 表:QRTZ_BLOB_TRIGGERS 创建表:CREATE TABLE `QRTZ_BLOB_TRIGGERS`( `TRIGGER_NAME` varchar(80) NOT NULL, `TRIGGER_GROUP` varchar(80) 非空, `BLOB_DATA` 长块, 主键(`TRIGGER_NAME`,`TRIGGER_GROUP`), KEY `qrtz_blob_triggers_ibfk_1`(`TRIGGER_NAME`,`TRIGGER_GROUP`), 约束`qrtz_blob_triggers_ibfk_1`外键(`TRIGGER_NAME`,`TRIGGER_GROUP`)参考`QRTZ_TRIGGERS`(`TRIGGER_NAME`,`TRIGGER_GROUP`), 约束`QRTZ_BLOB_TRIGGERS_ibfk_1`外键(`TRIGGER_NAME`,`TRIGGER_GROUP`)参考`QRTZ_TRIGGERS`(`TRIGGER_NAME`,`TRIGGER_GROUP`) ) 引擎=InnoDB 默认字符集=utf8 一组中的 1 行(0.00 秒)

使用

[...] add constraint QRTZ_BLOB_TRIGGERS_ibfk_1 foreign key [...]

工作正常。

我正在使用带有 MySQL 5.5 的 Ubuntu 12.04 LTS:

mysql-server-5.5     5.5.32-0ubuntu0.12.04.1

有人知道那里发生了什么吗?

【问题讨论】:

我厌倦了它......并且没有观察到相同的行为?!? 可能与lower_case_table_names有关? 也许你添加了两次?使用两个名称删除它。 按照 MySQL 手册的建议,我有 lower_case_table_names=0:“在 Unix 和 [...] 上使用 lower_case_table_names=0” 也许您使用的是不区分大小写的文件系统? (我什至不确定 this 是否会以某种方式影响约束标识符...:°) 【参考方案1】:

这是一个known bug,固定在upcoming release:

InnoDB 将重命名用户定义的外键约束,其名称中包含字符串“ibfk”,从而导致重复约束。”

错误报告建议在 5.1.72、5.5.32、5.6.14、5.7.2 版本中进行修复,但我怀疑 5.5 分支存在拼写错误。考虑到发布日期,我希望在 v5.5.34 中进行修复。

【讨论】:

以上是关于MySQL - 添加约束一次添加两次不同的情况的主要内容,如果未能解决你的问题,请参考以下文章

mysql中添加外键问题,求高手

添加数字时得到不同的结果

当添加到表视图境界项目出现两次

在启动屏幕上为不同的 iPhone(即各自的尺寸)添加不同的约束

Eager-load 相同的关系,不同的约束

2个不同的项添加到ArrayList但最新的项目是两次?