簡體   English   中英

PHP 'PDOException' 帶有消息'SQLSTATE [23000]:完整性約束

[英]PHP 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint

它應該做什么:從客戶表中刪除一個客戶。

SQL 用於借款人和客戶表:

create table customer
   (customer_name       varchar(15)     not null,
    customer_street     varchar(12)     not null,
    customer_city       varchar(15)     not null,
    primary key(customer_name))ENGINE=InnoDB;

create table borrower
   (customer_name       varchar(15)     not null,
    loan_number         varchar(15)     not null,
    primary key(customer_name, loan_number),
    foreign key(customer_name) references customer(customer_name),
    foreign key(loan_number) references loan(loan_number)
        ON UPDATE CASCADE ON DELETE CASCADE)ENGINE=InnoDB;

我知道由於參照完整性約束,我需要先刪除帶有外鍵的表。 如何先刪除帶有外鍵的表? 錯誤

PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`databaseName`.`borrower`, CONSTRAINT `borrower_ibfk_1` FOREIGN KEY (`customer_name`) REFERENCES `customer` (`customer_name`))' in /banking_update.php:18
Stack trace:
#0 /banking_update.php(18): PDOStatement->execute(Array)
#1 {main}
  thrown in /banking_update.php on line 18

PHP 代碼至今

<!DOCTYPE html>
<html>
<body>
<div style = "width:30%; float:left">
</div>

<?php 
include_once 'banking_db.php';
# form data
$customer_name=isset($_POST['customer_name']) ? $_POST['customer_name'] : '';
$customer_street=isset($_POST['customer_street']) ? $_POST['customer_street'] : '';
$customer_city=isset($_POST['customer_city']) ? $_POST['customer_city'] : '';
$query = "update customer set customer_name = :customer_name, customer_street = :customer_street, customer_city = :customer_city;";
$data = array( 'customer_name' => $customer_name, 'customer_street' => $customer_street, 'customer_city' => $customer_city);
$stmt = $conn->prepare($query);
if($stmt -> execute($data))
{
   $rows_affected = $stmt->rowCount();
   echo "<h2>".$rows_affected." row updated sucessfully!</h2>";
   include 'banking_display.php';
   display("SELECT * FROM customer;");
}
else
{
  echo "update failed: (" . $conn->errno . ") " . $conn->error;
}
$conn->close();
?>
</body>
</html>

就像評論中已經說過的那樣,您需要將ON UPDATE CASCADE ON DELETE CASCADE添加到外鍵。

但是您的查詢會使用相同的信息更新所有客戶,因此請在查詢中添加 `WHERE 子句

create table customer (customer_name varchar(15) not null, customer_street varchar(12) not null, customer_city varchar(15) not null, primary key(customer_name))ENGINE=InnoDB; create table borrower (customer_name varchar(15) not null, loan_number varchar(15) not null, primary key(customer_name, loan_number), foreign key(customer_name) references customer(customer_name) ON UPDATE CASCADE ON DELETE CASCADE)ENGINE=InnoDB;
 INSERT INTO customer VALUES ('TEST','teststreet','Testcity')
 INSERT INTO borrower VALUES ('TEST','loan1')
 UPDATE customer SET customer_name = 'test1', customer_street = 'teststreet1' WHERE customer_name = 'TEST'
 SELECT * FROM customer
 客戶名稱 | 客戶街 | 客戶城市:------------ |:-------------- |:------------ test1 | 測試街1 | 測試城

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM