【问题标题】:MySQL error #1005 errno 150MySQL错误#1005 errno 150
【发布时间】:2018-04-14 22:11:08
【问题描述】:

我不知道为什么我在这里收到错误。

当前表格:

CREATE TABLE `Clients` (
  `ClientID` varchar(8) NOT NULL,
  `Age` varchar(20) NOT NULL,
  `Postcode` varchar(6) NOT NULL,
  PRIMARY KEY (`ClientID`,`Age`,`Postcode`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `Disclosure` (
  `ClientID` varchar(8) NOT NULL,
  `Fname` varchar(100) DEFAULT NULL,
  `Lname` varchar(100) DEFAULT NULL,
  `Email` varchar(100) DEFAULT NULL,
  `Postcode` varchar(6) NOT NULL,
  `Offender` varchar(45) DEFAULT NULL,
  `Location` varchar(100) DEFAULT NULL,
  `Age` varchar(20) NOT NULL,
  `Support` varchar(45) DEFAULT NULL,
  `Disclosure` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`ClientID`,`Postcode`,`Age`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

尝试添加外键

ALTER TABLE `FYP`.`Disclosure` 
ADD CONSTRAINT `client`
  FOREIGN KEY (`ClientID` , `Postcode` , `Age`)
  REFERENCES `FYP`.`Clients` (`ClientID` , `Postcode` , `Age`)
  ON DELETE NO ACTION
  ON UPDATE CASCADE;

我已经尝试使用 show status 来查看错误是什么,但我仍然无法弄清楚。

 SHOW ENGINE INNODB STATUS

返回:

------------ 最新的外键错误 ------------------------ 171102 11:35:10 表 FYP/#sql-266_33b 的外键约束出错:

外键(ClientIDPostcodeAge)参考 FYP.Clients (ClientID , Postcode , Age) 删除否 更新级联操作:在引用中找不到索引 引用的列显示为第一列的表,或 表中的列类型和引用的表不匹配 约束。注意 ENUM 和 SET 的内部存储类型 在使用 >= InnoDB-4.1.12 创建的表中进行了更改,并且在 新表中的此类列不能引用旧表。看 http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html 正确的外键定义。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您需要在引用的列上建立索引。索引中列的顺序很重要。在 clients 表中将主键更改为

    (`ClientID`,`Postcode`,`Age`)
    

    应该这样做

    ALTER TABLE clients DROP PRIMARY KEY, ADD PRIMARY KEY (`ClientID`,`Postcode`,`Age`);
    

    【讨论】:

    • 感谢您解决了这个问题 =)
    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多