簡體   English   中英

PHP,PDO,MySQL和InnoDB,如何使用FK更新/刪除記錄?

[英]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.

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