不能同时约束连接表列

Posted

技术标签:

【中文标题】不能同时约束连接表列【英文标题】:Can't Constrain Both Junction Table Columns 【发布时间】:2015-06-03 16:38:41 【问题描述】:

我有一个包含两个外键(来自 Profiles 和 Districts 表)的连接表,两列都作为复合主键。

  `profID` int(11) NOT NULL,
  `distID` varchar(8) NOT NULL,
  PRIMARY KEY (`profID`,`distID`)

我想约束两列,但是mysql抛出错误:

    #1050 - Table './database_name/z@002dprof@002ddist' already exists 

在解决问题时,我尝试从头开始创建另一个重复的连接表,但我得到了同样的错误。奇怪的是,MySQL 将允许我限制一列或另一列,但不能限制两列。我很难过,因为我有其他(非联结)表对多个外键列有约束。

顺便说一下,我用的是phpMyAdmin,所有的表都是带有utf-8的InnoDB。

任何帮助将不胜感激。

添加:显示 CREATE TABLE 结果

CREATE TABLE `Profiles` (
 `profID` int(11) NOT NULL AUTO_INCREMENT,
 `email` varchar(64) NOT NULL,
 `stID` varchar(2) NOT NULL,
 `zip` varchar(5) NOT NULL,
 PRIMARY KEY (`profID`),
 KEY `stID` (`stID`,`zip`),
 KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8

CREATE TABLE `Districts` (
 `distID` varchar(8) NOT NULL,
 `stID` varchar(2) NOT NULL,
 `abbrev` varchar(16) NOT NULL,
 PRIMARY KEY (`distID`),
 KEY `stID` (`stID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `z-prof-dist` (
 `profID` int(11) NOT NULL,
 `distID` varchar(8) NOT NULL,
 PRIMARY KEY (`profID`,`distID`),
 KEY `distID` (`distID`),
 KEY `profID` (`profID`),
 CONSTRAINT `z-prof-dist_ibfk_1` FOREIGN KEY (`distID`) REFERENCES `Districts` (`distID`) 
    ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

【问题讨论】:

你能分享你完整的ddl吗? 请显示所有 3 个相关表的创建表语句。 这些创建语句在SQL Fiddle 上运行良好。尝试使用不同的约束名称(更改z-prof-dist_ibfk_1)我前段时间有一些非常相似的东西...... 【参考方案1】:

我想我找到了解决办法。我没有使用 phpMyAdmin 函数来添加约束(我不断收到错误消息),而是遵循 marekful 的领导,使用 SQL ALTER TABLE 查询(具有新的约束名称),如下所示:

ALTER TABLE `z-prof-dist` 
ADD CONSTRAINT `test1` 
  FOREIGN KEY (`profID`) REFERENCES `Profiles` (`profID`) 
ON UPDATE CASCADE

我还是不明白原来报错的原因,但是可以看到新添加的外键约束工作正常。

【讨论】:

以上是关于不能同时约束连接表列的主要内容,如果未能解决你的问题,请参考以下文章

数据库---约束

如何从表列中删除唯一约束?

在 BigQuery SQL 中:在满足日期约束时检查和更新表列值

如何在 sql server 2008 中获取没有约束的表列?

如何检索所有表列、数据类型、数据长度、约束类型以及引用的列和表

从 CSV 填充 postgres 表列时出现非空约束错误