2012-02-01 104 views
1

我有以下兩個MySQL表的 '孩子' 表具有DELETE CASCADE動作從 '父' 設置:DELETE CASCADE中的MySQL

父表

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

您的'detectlocations'表在哪裏?您正在執行插入操作,但是在哪裏?您需要在子表中首先插入父表中。不是相反的。 – B4NZ41 2012-02-01 17:08:05

+0

嗨@Fernando,非常感謝您看我的帖子,並道歉,因爲它包含一些拼寫錯誤。我現在糾正了這些。親切的問候 – IRHM 2012-02-01 17:47:02

+0

你需要先插入userdetails'原因位置是一個子表,它依賴於userdetails。第一位用戶在位置之後。對? – B4NZ41 2012-02-01 17:56:42

回答

0

按照順序:

首先我有一些數據插入到的UserDetails

INSERT INTO `test`.`userdetails` (`userid`, `forename`, `surname`, `emailaddress`, `password`, `passwordhint`, `subscriptionexpiration`, `salt`) VALUES (NULL, 'John', 'Doo', '[email protected]', '1234', 'seq.', '2012-02-02', '[email protected]#$%*ERTYFGHJCVBFGH%*RUJK'); 

詳細信息:如果我嘗試插入到子表首先返回到我的信息你已經得到了。然後首先我需要將數據插入到userdetails中。注意你有一個外鍵,那麼你需要使用userid(你的鍵)插入到子表中。對?

現在來看看我是如何將數據插入到子表

INSERT INTO `test`.`locations` (`userid`, `locationid`, `locationname`) VALUES ('2', '25', 'Brazil'); 

1行(S)插入。

你能看到userid(2)嗎?

那麼我建議:

當用戶註冊一個新帳號,你還創建位置表(子表)的插入,因爲你需要在位置表的用戶ID,當用戶回來更新數據。否則,你會得到這個錯誤信息。

我在這裏測試和工作!讓我知道如果適合你。

+0

@Ferrando,對此表示誠摯的感謝。今晚我要通過這個工作,我會看看我如何繼續。我會讓你知道的。親切的問候 – IRHM 2012-02-01 19:12:02

+0

不客氣。只是個提醒。使用innodb表(外鍵)時。這是遵循的方式,沒有父母的ID就不允許更新子表。數據庫將檢查孩子是否有父母的ID。如果是,則允許拒絕。 – B4NZ41 2012-02-01 19:17:45