在mySQL中删除CASCADE

时间:2012-02-01 17:01:53

标签: mysql

我有以下两个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)

我不知道为什么我得到这个,因为父表中有记录。我一直在努力工作几个小时,我找不到答案。

我只是想知道是否有人可以看看这个,让我知道我哪里出错了。

非常感谢

1 个答案:

答案 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。否则您将收到此错误消息。

我在这里测试并且有效!让我知道是否适合你。