[英]PHP, PDO, MySQL & InnoDB, how to update/delete records with FK?
我已經讀過類似的問題,但是關於使用ON DELETE和ON UPDATE的信息並沒有非常詳細的解釋,所以我很難理解,當您要刪除或更新記錄時,有什么正確的步驟來更新數據庫? FK約束,但在引用時不刪除其他表中的記錄,而是將這些引用設置為null或0或其他表中的內容。
我正在嘗試為此數據庫(用於電子購物車系統)創建功能庫,以便可以由管理員(如CMS)管理該數據庫。
我選擇了InnoDB引擎來利用外鍵和事務。
我還使用PHP PDO對象而不是標准的mysql_
來使用參數化查詢。
這是這些表的SQL創建代碼:
# TBL_MENU_CATEGORY
DROP TABLE IF EXISTS tbl_menu_category;
CREATE TABLE tbl_menu_category(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(50)
) ENGINE = InnoDB;
# TBL_PRODUCT_CATEGORY
DROP TABLE IF EXISTS tbl_product_category;
CREATE TABLE tbl_product_category(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(50)
) ENGINE = InnoDB;
# TBL_MENU_CAT_BASKET
DROP TABLE IF EXISTS tbl_menu_cat_basket;
CREATE TABLE tbl_menu_cat_basket(
menu_id INT,
FOREIGN KEY(menu_id) REFERENCES tbl_menu_category(id),
cat_id INT,
FOREIGN KEY(cat_id) REFERENCES tbl_product_category(id)
) ENGINE = InnoDB;
# TBL_PRODUCT_CAT_BASKET
DROP TABLE IF EXISTS tbl_product_cat_basket;
CREATE TABLE tbl_product_cat_basket(
cat_id INT,
FOREIGN KEY(cat_id) REFERENCES tbl_product_category(id),
product_id INT,
FOREIGN KEY(product_id) REFERENCES tbl_product(id)
) ENGINE = InnoDB;
庫中的一項功能是向菜單添加子菜單(菜單>子菜單>產品)。
function addSubmenu($menu_id, $sub_name) {
$success = false;
if ( dbTransaction() ) {
$sql = "INSERT INTO tbl_product_cat(name) VALUES ('?');";
dbQuery($sql, array($sub_name));
$rows = dbRowsAffected();
if ($rows == 1) {
$cat_id = dbLastInsertId();
$sql = "INSERT INTO tbl_menu_cat_basket(menu_id, cat_id) VALUES ('?','?');";
dbQuery($sql, array((int)$menu_id, (int)$cat_id));
$rows = dbRowsAffected();
if ($rows == 1) {
$success = true;
}
}
if ($success)
dbCommit();
return "Add submenu successful.";
else
dbRollback();
return "Add submenu failed.";
}
}
查詢執行如下:
require_once "pdo.php"; # Creates PDO object '$db'
$query;
function dbQuery($sql, $data) {
global $db, $query;
$query = $db->prepare($sql);
$query->execute($data);
}
# other PDO & PDOStatement methods like this
# (rowCount, lastInsertId, fetchAll, transaction-stuff).
我什至不確定這是否正確。 我是走正確的道路還是做錯了事?
現在,我堅持創建類似的功能來更新也具有外鍵的記錄。 我知道InnoDB會引發錯誤,因為該記錄具有引用(我認為?),所以無法更新該記錄。
我需要知道更新記錄的正確過程以及為此可用的功能。
我想了解ON DELETE和ON UPDATE約束,但是我似乎找不到任何對新手友好的優秀教程(MySQL文檔非常不友好,甚至不突出語法)。
在更新記錄時,我想級聯更新,以便所有引用都被更新。
在刪除記錄時,我只想刪除已刪除的記錄,但是可以重設對該記錄的任何引用(如果刪除了產品類別,則不應刪除產品;如果刪除了產品,則不應刪除該產品的所有訂單但產品值設置為0或null)
我該如何使用ON DELETE和ON UPDATE來執行此操作-或-應該采取什么步驟來實現我在這里想要執行的操作?
感謝您的閱讀。
在外鍵規范中指定ON UPDATE CASCADE ON DELETE SET NULL
應該可以解決問題。
例如, FOREIGN KEY(product_id) REFERENCES tbl_product(id) ON UPDATE CASCADE ON DELETE SET NULL
。 盡管我想知道您在哪里預見到更改主鍵值有意義的情況。
您可能對MySQL Workbench感興趣-它可以幫助您直觀地設計架構並顯示相應的DDL語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.