MySQL中constraint的唯一性
最近的一个项目里用到了大量的外键(由于之前的工作经验中几乎从未用到过外键约束,对于外键命名规则忘记的差不多了),而使用E-R图导出的sql脚本在执行时总是会有那么几张表创建失败。查看了一下导出的建表语句失败的表中有一张如下:
CREATE TABLE IF NOT EXISTS `pdb`.`pdb_media_report` (
`media_id` INT NOT NULL COMMENT '媒体ID',
`type` INT NOT NULL COMMENT '报表数据类型',
`time` TIMESTAMP NOT NULL COMMENT '报表数据时间',
`value` INT NULL COMMENT '报表数据值',
PRIMARY KEY (`media_id`, `type`, `time`),
INDEX `type_idx` (`type` ASC),
CONSTRAINT `fk_media_id`
FOREIGN KEY (`media_id`)
REFERENCES `pdb`.`pdb_media` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_type`
FOREIGN KEY (`type`)
REFERENCES `pdb`.`pdb_report_type` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
在创建时总是会提示失败,信息为
ERROR 1022 (23000): Can't write; duplicate key in table 'pdb_media_report'
想破头也没发现这个语句里有什么重复的key,于是另建了一个DB,单独创建这张表(作为外键的表已创建),竟然成功了(此刻幸好没有往MySQL版本上怀疑)。
于是将原因转移到与其他表的外键约束有重复或者冲突,果然,发现另有一张表
CREATE TABLE IF NOT EXISTS `pdb`.`pdb_project_report` (
`project_id` INT NOT NULL COMMENT '项目ID',
`type` INT NOT NULL COMMENT '报表统计类型',
`time` TIMESTAMP NOT NULL COMMENT '报表数据时间',
`value` INT NOT NULL COMMENT '报表统计值',
PRIMARY KEY (`project_id`, `type`, `time`),
INDEX `type_idx` (`type` ASC),
CONSTRAINT `fk_type`
FOREIGN KEY (`type`)
REFERENCES `pdb`.`pdb_report_type` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_project_id`
FOREIGN KEY (`project_id`)
REFERENCES `pdb`.`pdb_project` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
这张表里也创建了一个约束,名为‘fk_type’,与出问题的那张表中定义的约束重名。立刻做测试,将此表删除,将出问题的表创建,成功了,再创建此表,失败,错误信息完全一致。
得知,在MySQL中 CONSTRAINT的定义是全局唯一的。