无法插入:外键约束失败

时间:2016-02-22 15:36:07

标签: php mysql database sql-insert foreign-key-relationship

我有以下表格:

CREATE TABLE IF NOT EXISTS `location`(
    `ID` int(11) NOT NULL,
    `name` varchar(25) NOT NULL,
    `water` varchar(25) NOT NULL,
    `fodder` varchar(25) NOT NULL,
    `access` varchar(25) NOT NULL,
    PRIMARY KEY  (`ID`)
    KEY `water` (`water`)
    KEY `fodder` (`fodder`)
    KEY `access` (`access`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `watercondition`(
    `ID` int(11) NOT NULL,
    `watervalue` varchar(25) NOT NULL,
    PRIMARY KEY  (`watervalue`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `foddercondition`(
    `ID` int(11) NOT NULL,
    `foddervalue` varchar(25) NOT NULL,
    PRIMARY KEY  (`foddervalue`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `accesscondition`(
    `ID` int(11) NOT NULL,
    `accessvalue` varchar(25) NOT NULL,
    PRIMARY KEY  (`accessvalue`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

对于约束表:

ALTER TABLE `location`
    ADD CONSTRAINT `location_ibfk2` FOREIGN KEY (`water`) REFERENCES `watercondition` (`watervalue`),
    ADD CONSTRAINT `location_ibfk3` FOREIGN KEY (`fodder`) REFERENCES `foddercondition` (`foddervalue`),
    ADD CONSTRAINT `location_ibfk4` FOREIGN KEY (`access`) REFERENCES `accesscondition` (`accessvalue`);

在我的php文件中,我想在所有表中插入一个值,如下所示:

$sqlwater = "INSERT INTO  `watercondition` (`ID`, `watervalue`) VALUES ('".$_SESSION['loc_id']."', '$watervalue')";
$resultwater = mysqli_query($con, $sqlwater) or die (mysqli_error($con));

$sqlfodder = "INSERT INTO  `foddercondition` (`ID`, `foddervalue`) VALUES ('".$_SESSION['loc_id']."', '$foddervalue')";
$resultfodder = mysqli_query($con, $sqlfodder) or die (mysqli_error($con));

$sqlaccess = "INSERT INTO  `accesscondition` (`ID`, `accessvalue`) VALUES ('".$_SESSION['loc_id']."', '$accessvalue')";
$resultaccess = mysqli_query($con, $access) or die (mysqli_error($con));

$sqlloc = "INSERT INTO  `location` (`ID`, `name`) VALUES ('".$_SESSION['loc_id']."', '$name')";
$resultaccess = mysqli_query($con, $access) or die (mysqli_error($con));

但是当我执行php文件时,我收到此错误:

  

无法添加或更新子行:外键约束失败(mydblocation,CONSTRAINT location_ibfk2 FOREIGN KEY(water)参考waterconditionwatervalue))

当我检查我的数据库时,waterfodderaccess的值已经插入db,但不在我的location表中。

4 个答案:

答案 0 :(得分:2)

location表中的插入内容还必须包含waterfodderlocation列的值。它们是location表中的列,不能忽略。

您在最终查询中也使用了错误的查询变量。

我想这里发生的事情是,在检查你是否拥有所有NOT NULL字段的值之前,MYSQL正在验证约束,因此在更明显的关于缺少列值的值之前得到约束错误

$sqlloc = "INSERT INTO  `location` 
           (`ID`, `name`, `water`, `fodder`, `location`) 
      VALUES ('{$_SESSION['loc_id']}', '$name', 
              '$watervalue', '$foddervalue', '$accessvalue' )";

$resultaccess = mysqli_query($con, $sqlloc) or die (mysqli_error($con));

答案 1 :(得分:0)

更改上一个插入语句,如下所示:

"INSERT INTO  `location` (`ID`, `name`,`water`,`fodder`,`access`) VALUES 
 ('".$_SESSION['loc_id']."', '$name','$watervalue','$foddervalue','$accessvalue')";

<强>解释

<强> ERD:

enter image description here

看黄色标记的表是表,而location表是子表。

因此,根据MySQL,您无法通过在相应父表中不存在的某些外键值添加或更新子表行(location)。

在前三个插入语句中,您正在更新三个父表,这很好。

但是在最后的插入语句中,您正在尝试更新您提供的子表,而这些外键不是异常的值。

SQL FIDDLE

Reference

答案 2 :(得分:0)

您应该将外键插入到您的位置表中,以保持之前创建的关系。

您对位置的查询应该类似于

`$sqlloc = "INSERT INTO  'location' ('ID', 'name', 'water', 'footer', 'access') VALUES ('".$_SESSION['loc_id']."', '$name', 'water-related-id', 'fodder-related-id, 'access-related-id)";`

无论如何,表的主键应该是'id'列,而外键应该是其他表的主键,所以你的约束应该是

ALTER TABLE 'location'
    ADD CONSTRAINT 'location_ibfk2' FOREIGN KEY ('water') REFERENCES 'watercondition' ('id'),
    ADD CONSTRAINT 'location_ibfk3' FOREIGN KEY ('fodder') REFERENCES 'foddercondition' ('id'),
    ADD CONSTRAINT 'location_ibfk4' FOREIGN KEY ('access') REFERENCES 'accesscondition' ('id');

并且,您的外键数据类型应匹配引用表的键,在您的情况下为int(11)。


你这样做是为了大学任务吗?

答案 3 :(得分:-1)

这里要注意的是:

首先,您的插入不起作用,因为您创建了所有外键&#34; NOT NULL&#34;字段,因此当您在位置表上插入记录时,您必须提供这些值。

其次,您必须确保作为外键的字段在原始表上具有相同的数据类型。在您的代码中,您在原始表上使用INT(11)id字段,但在位置表上使用VARCHAR(25),并且您链接到保存值的字段,而不是链接到主键(id)字段参考表。

亲切的问候, 丹尼尔