【问题标题】:Adding Foreign key but getting constraint violation error添加外键但出现约束冲突错误
【发布时间】:2015-01-23 07:50:49
【问题描述】:

我有四张桌子:

1)Country:Two columns
  a) country_id
  b) country_name

2)State: Three columns
  a) state_id
  b) state_name
  c) country_id(foreign key)

 3)City: Three Columns
   a) city_id
   b) city_name
   c) state_id(foreign key)

 4) Doctor: 20 Columns
   a) doc_id (primary key)
   b) doc_name
   c) email,gender age and so on 

我已经用 dara 填充了这些表。

我在医生表中添加三个新列:country_id、state_id 和 city_id 作为外键。

当我在该表中插入 country_id、state_id 和 city_id 作为外键时,出现此错误

1452 - Cannot add or update a child row: a foreign key constraint fails (`medical_network`.`#sql-4174_45`, CONSTRAINT `#sql-4174_45_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON DELETE CASCADE ON UPDATE CASCADE)

我知道这是一个基本错误,但找不到错误。

医生桌:

CREATE TABLE `doctor` (
 `doc_id` int(9) NOT NULL AUTO_INCREMENT,
 `doc_fname` varchar(15) NOT NULL,
 `doc_lname` varchar(15) NOT NULL,
 `doc_province` varchar(20) NOT NULL,
 `doc_city` varchar(25) NOT NULL,
 `doc_gender` varchar(10) NOT NULL,
 `doc_fathername` varchar(32) NOT NULL,
 `doc_age` varchar(20) NOT NULL,
 `doc_cnic` varchar(16) NOT NULL,
 `doc_medclgname` varchar(100) NOT NULL,
 `doc_specilization` varchar(100) NOT NULL,
 `doc_phoneno` varchar(20) NOT NULL,
 `doc_officeno` varchar(20) NOT NULL,
 `doc_email` varchar(25) NOT NULL,
 `doc_gradyear` int(10) NOT NULL,
 `doc_licenseno` varchar(30) NOT NULL,
 `doc_hosp` varchar(200) NOT NULL,
 `doc_pass` varchar(35) NOT NULL,
 `doc_address` varchar(100) NOT NULL,
 `doc_country` varchar(100) NOT NULL,
 `doc_img` varchar(200) NOT NULL,
 `totime` time NOT NULL,
 `fromtime` time NOT NULL,
 `todate` date NOT NULL,
 `fromdate` date NOT NULL,
 `country_id` int(20) NOT NULL,
 PRIMARY KEY (`doc_id`),
 KEY `country_id` (`country_id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=latin

国家/地区表:

CREATE TABLE `country` (
 `country_id` int(20) NOT NULL AUTO_INCREMENT,
 `country_name` varchar(200) NOT NULL,
 PRIMARY KEY (`country_id`)
) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1

状态表查询:

CREATE TABLE `state` (
 `state_id` int(20) NOT NULL AUTO_INCREMENT,
 `state_name` varchar(200) NOT NULL,
 `country_id` int(20) NOT NULL,
 PRIMARY KEY (`state_id`),
 KEY `country_id` (`country_id`),
 CONSTRAINT `state_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1

城市表:

CREATE TABLE `city` (
 `city_id` int(20) NOT NULL AUTO_INCREMENT,
 `city_name` varchar(200) NOT NULL,
 `state_id` int(20) NOT NULL,
 PRIMARY KEY (`city_id`),
 KEY `state_id` (`state_id`),
 CONSTRAINT `city_ibfk_1` FOREIGN KEY (`state_id`) REFERENCES `state` (`state_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1

【问题讨论】:

  • 显示Doctor的结构。
  • 发布所有涉及的父表和子表的创建表语句。
  • @Ravinder Edited now see..
  • 您的create 声明很好。问题可能出在与关系不匹配的现有数据上。请检查 child 表中是否存在任何不匹配的数据
  • 医生 ID 作为外键出现在另外两个表中,但我认为添加列不会影响该子表。

标签: mysql foreign-keys constraints


【解决方案1】:
  1. 首先在表中添加所有你想要做外键的列。

  2. 在其中添加一些相关数据。

  3. 现在更改表并将这些新添加的列设为外键。

    即 ALTER TABLE TblName AD 外键 (P_Id) 参考父表(P_Id)

【讨论】:

    【解决方案2】:

    英文:

    你有一些医生在不知名的国家。

    在 DB 中:

    doctor 的一行或多行的 country_id 值在 countrycountry_id 列中找不到。

    检查国家表中是否存在新医生行的country_id 值。

    如果医生行已存在,则查找它们:

    select d.*
    from doctor d
    left join country c on c.country_id = doctor.country_id
    where c.country_id is null
    

    【讨论】:

      【解决方案3】:

      改变'doctor'表中的country_id int(20) NULL列

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多