我有以下两个mySQL表,其中'child'表具有来自'parent'的DELETE CASCADE操作集:
PARENT TABLE
CREATE TABLE `userdetails` (
`userid` int(6) NOT NULL auto_increment,
`forename` varchar(20) NOT NULL,
`surname` varchar(30) NOT NULL,
`emailaddress` varchar(150) NOT NULL,
`password` varchar(200) NOT NULL,
`passwordhint` varchar(20) NOT NULL,
`subscriptionexpiration` date NOT NULL,
`salt` varchar(200) NOT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
儿童表
CREATE TABLE `locations` (
`userid` int(6) NOT NULL,
`locationid` int(6) NOT NULL auto_increment,
`locationname` varchar(80) NOT NULL,
PRIMARY KEY (`locationid`),
KEY `userid` (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
--
-- Constraints for dumped tables
--
--
-- Constraints for table `locations`
--
ALTER TABLE `locations`
ADD CONSTRAINT `locations_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `userdetails` (`userid`) ON DELETE CASCADE;
然后我尝试运行以下php脚本:
<?php
require("phpfile.php");
// Gets data from URL parameters
$userid = $_POST["userid"];
$locationname = $_POST["locationname"];
// Opens a connection to a MySQL server
$connection = mysql_connect ("hostname", $username, $password);
if (!$connection) {
die('Not connected : ' . mysql_error());
}
// Set the active MySQL database
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected) {
die ('Can\'t use db : ' . mysql_error());
}
// Insert new row with user data
$query = "INSERT INTO locations (userid, locationname) VALUES ('$userid', '$locationame')";
$result = mysql_query($query);
if (!$result) {
die('Invalid query: ' . mysql_error());
}
我收到此错误:
Invalid query: Cannot add or update a child row: a foreign key constraint fails (`dbname/locations`, CONSTRAINT `locations_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `userdetails` (`userid`) ON DELETE CASCADE)
我不知道为什么我得到这个,因为父表中有记录。我一直在努力工作几个小时,我找不到答案。
我只是想知道是否有人可以看看这个,让我知道我哪里出错了。
非常感谢
答案 0 :(得分:0)
按照顺序:
首先我在userdetails中插入了一些数据
INSERT INTO `test`.`userdetails` (`userid`, `forename`, `surname`, `emailaddress`, `password`, `passwordhint`, `subscriptionexpiration`, `salt`) VALUES (NULL, 'John', 'Doo', 'johndoo@john.com', '1234', 'seq.', '2012-02-02', '!@#$%*ERTYFGHJCVBFGH%*RUJK');
详细信息:如果我首先尝试插入子表,它会返回给您已有的消息。然后首先我需要将数据插入到userdetails中。注意你有一个外键,然后你需要用户ID(你的密钥)插入子表。正确?
现在看一下我如何将数据插入子表
INSERT INTO `test`.`locations` (`userid`, `locationid`, `locationname`) VALUES ('2', '25', 'Brazil');
插入了1行。
你能看到用户ID(2)吗?
然后我建议:
当用户注册新帐户时,还会创建位置表(子表)的插入,因为当用户返回更新数据时,您将需要位置表中的用户ID。否则您将收到此错误消息。
我在这里测试并且有效!让我知道是否适合你。