我有以下表格:
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文件时,我收到此错误:
无法添加或更新子行:外键约束失败(
mydb
。location
,CONSTRAINTlocation_ibfk2
FOREIGN KEY(water
)参考watercondition
(watervalue
))
当我检查我的数据库时,water
,fodder
和access
的值已经插入db,但不在我的location
表中。
答案 0 :(得分:2)
location
表中的插入内容还必须包含water
,fodder
和location
列的值。它们是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:
看黄色标记的表是父表,而location
表是子表。
因此,根据MySQL,您无法通过在相应父表中不存在的某些外键值添加或更新子表行(location
)。
在前三个插入语句中,您正在更新三个父表,这很好。
但是在最后的插入语句中,您正在尝试更新您提供的子表,而这些外键不是异常的值。
答案 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)字段参考表。
亲切的问候, 丹尼尔