2015-06-17 95 views
1

在執行我的doDelete.php,出現此錯誤消息:錯誤消息:不能刪除或更新父行,外鍵約束失敗

「無法刪除或更新父行,外鍵約束失敗( 。fypbook,約束book_user_key外鍵(id)參考文獻userid)ON DELETE NO ACTION ON UPDATE NO ACTION)「

刪除查詢:

$queryDelete = "DELETE FROM user WHERE id = $theUserID"; 

從3個表檢索信息查詢:

$query2 = "SELECT * FROM user,country,book where book.id=user.id AND user.country_id=country.country_id ORDER BY `user`.`id` ASC"; 

我的「書」和「用戶」表之間的關係是用戶能夠添加一本書。因此,用戶ID被放置在書本表中以識別哪個用戶添加了書。但是,當我想從我的PHP中刪除一個用戶,上面的錯誤信息出現。這是檢索用戶ID以刪除用戶的一個片段。我該如何解決?

<td><form method="post" action="doDelete.php"><input type="hidden" name="theUserID" value="<?php echo $rows['id']; ?>" /><input type="submit" value="Delete" /</form></td> 

下面是相關表格

CREATE SCHEMA IF NOT EXISTS `fyp` ; 
USE `fyp` ; 



-- ----------------------------------------------------- 
-- Table `fyp`.`country` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `fyp`.`country` ; 

CREATE TABLE IF NOT EXISTS `fyp`.`country` (
`country_id` INT NOT NULL AUTO_INCREMENT, 
`country` VARCHAR(45) NOT NULL, 
PRIMARY KEY (`country_id`)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `fyp`.`user` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `fyp`.`user` ; 

CREATE TABLE IF NOT EXISTS `fyp`.`user` (
`id` INT NOT NULL AUTO_INCREMENT, 
`user_name` VARCHAR(45) NOT NULL, 
`password` VARCHAR(45) NOT NULL, 
`email_address` VARCHAR(45) NOT NULL, 
`date_of_birth` DATE NOT NULL, 
`country_id` INT NOT NULL, 
`gender_id` INT NOT NULL, 
`role_id` INT NOT NULL, 
`last_login` TIMESTAMP NULL, 
PRIMARY KEY (`id`), 
INDEX `fk_user_country1_idx` (`country_id` ASC), 
INDEX `fk_user_gender1_idx` (`gender_id` ASC), 
INDEX `fk_user_role1_idx` (`role_id` ASC), 
CONSTRAINT `user_country_key` 
FOREIGN KEY (`country_id`) 
REFERENCES `fyp`.`country` (`country_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION, 
CONSTRAINT `user_gender_key` 
FOREIGN KEY (`gender_id`) 
REFERENCES `fyp`.`gender` (`gender_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION, 
CONSTRAINT `user_role_key` 
FOREIGN KEY (`role_id`) 
REFERENCES `fyp`.`role` (`role_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB; 



-- ----------------------------------------------------- 
-- Table `fyp`.`book` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `fyp`.`book` ; 

CREATE TABLE IF NOT EXISTS `fyp`.`book` (
`book_id` INT NOT NULL AUTO_INCREMENT, 
`title` VARCHAR(45) NOT NULL, 
`ISBN` VARCHAR(45) NOT NULL, 
`book_desc` VARCHAR(100) NOT NULL, 
`year_published` VARCHAR(45) NOT NULL, 
`year_of_birth` YEAR NOT NULL, 
`image` VARCHAR(45) NULL, 
`genre_id` INT NOT NULL, 
`publisher_id` INT NOT NULL, 
`user_id` INT NOT NULL, 
PRIMARY KEY (`book_id`), 
INDEX `fk_book_publishers1_idx` (`publisher_id` ASC), 
INDEX `fk_book_user1_idx` (`user_id` ASC), 
INDEX `fk_book_genre1_idx` (`genre_id` ASC), 
CONSTRAINT `book_publishers_key` 
FOREIGN KEY (`publisher_id`) 
REFERENCES `fyp`.`publishers` (`publisher_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION, 
CONSTRAINT `book_user_key` 
FOREIGN KEY (`user_id`) 
REFERENCES `fyp`.`user` (`id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION, 
CONSTRAINT `book_genre_key` 
FOREIGN KEY (`genre_id`) 
REFERENCES `fyp`.`genre` (`genre_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

回答

1

事實上,你在書中表的約束,這並不讓你刪除一個用戶,只要有書由該用戶說:

CONSTRAINT `book_user_key` 
FOREIGN KEY (`user_id`) 
REFERENCES `fyp`.`user` (`id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION 

你可以把它改成

ON DELETE CASCADE 

,這樣刪除用戶也會刪除他們的所有書籍。

或者你可以約束設置爲

ON DELETE SET NULL 

並從book.user_id NOT NULL:這將保留刪除用戶的書,但設置其USER_ID爲NULL。

0

您不能創建用戶記錄,因爲它具有表中的相關記錄。外鍵約束是如何工作的。您在此行中創建了這個約束:從用戶表中刪除特定用戶之前在

  1. 刪除記錄表給定用戶ID:

    FOREIGN KEY (`user_id`) REFERENCES `fyp`.`user` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION 
    

    爲了解決這個問題,你可以。這將需要逐個執行2個DELETE語句。

  2. 修改外鍵並使用ON DELETE CASCADE。這將導致本本的表中的記錄將被自動刪除,同時用戶的表中的相關記錄將被刪除。

我更喜歡解決方案1,因爲它給了您更多的控制權。它也不太容易出錯,因爲您必須始終顯式刪除2個表中的記錄。在第二種情況下,您可能會意外刪除數據庫中的大量數據。

0

我相信你有1個或多個user_id說明(您想刪除)在表中的數據。

由於user_id說明表是一個外鍵ID用戶表,然後在用戶任何刪除操作表將由約束book_user_key被限制)。

您可以檢查數據是否存在或不是由SQL使用此查詢:

SELECT * FROM fyp.book WHERE user_id = ***[UserIDWhichYouWantToDelete]*** 

所以,接下來的事情就是,你有什麼打算做的,如果你已經擁有了「用戶」數據書桌?

在許多網站上您可以找到關於FOREIGN_KEY的更多文獻。

相關問題