MySQL中constraint的唯一性

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的定义是全局唯一的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值