Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP、PDO、MySQL和;InnoDB,如何使用FK更新/删除记录?_Php_Mysql_Pdo_Foreign Keys_Innodb - Fatal编程技术网

PHP、PDO、MySQL和;InnoDB,如何使用FK更新/删除记录?

PHP、PDO、MySQL和;InnoDB,如何使用FK更新/删除记录?,php,mysql,pdo,foreign-keys,innodb,Php,Mysql,Pdo,Foreign Keys,Innodb,我读过类似的问题,但没有关于在删除和更新时使用的非常详细的解释,因此我很难理解这一点,以及当您希望删除或更新具有FK约束的记录,但在引用时不删除其他表中的记录时,更新数据库的正确过程是什么,但是在其他表中将这些引用设置为null或0或其他值 背景 我正在尝试为这个数据库创建一个函数库(用于电子购物车系统),这样数据库就可以由管理员(比如CMS)管理 我选择InnoDB引擎来利用外键和事务 我还使用了PHP PDO对象,而不是标准的mysql\uuz-函数来使用参数化查询 以下是这些表的SQL创建

我读过类似的问题,但没有关于在删除和更新时使用的非常详细的解释,因此我很难理解这一点,以及当您希望删除或更新具有FK约束的记录,但在引用时不删除其他表中的记录时,更新数据库的正确过程是什么,但是在其他表中将这些引用设置为null或0或其他值

背景 我正在尝试为这个数据库创建一个函数库(用于电子购物车系统),这样数据库就可以由管理员(比如CMS)管理

我选择InnoDB引擎来利用外键和事务

我还使用了PHP PDO对象,而不是标准的
mysql\uuz
-函数来使用参数化查询

以下是这些表的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;
这是库中的一个函数,用于将子菜单添加到菜单(菜单>子菜单>产品)

查询的执行方式如下:

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会抛出一个错误,记录无法更新,因为它有引用(我想?)

我需要知道更新记录的正确程序以及我可以使用的功能

我想知道关于删除和更新的限制,但我似乎找不到任何好的、对新手友好的教程(MySQL文档非常不友好,甚至没有突出显示语法)

我想做什么 更新记录时,我希望级联更新,以便更新所有引用

删除记录时,我只想删除已删除的记录,但可以重置对该记录的任何引用(如果删除了产品类别,则不应删除产品;如果删除了产品,则不应删除该产品的所有订单,但产品值设置为0或null)

我如何在删除和更新时做到这一点?或者,我应该采取什么程序来实现我想在这里做的事情


感谢阅读。

在外键规范中指定更新级联上的
删除集NULL
,应该可以解决这个问题

例如,
外键(product\u id)在DELETE SET NULL的更新级联上引用tbl\u product(id)。虽然我想知道你在哪里预见到改变主键值会有意义的情况


您可能会感兴趣-它可以帮助您直观地设计模式并显示相应的DDL语句。

感谢您的回答。。。那就这些了?。顺便说一句,你的意思是只要我不更改主键ID值,我就可以更新其他字段而不会出现任何问题吗?是的,外键机制只涉及外键规范中提到的字段。其他字段可以随意修改。感谢您的帮助:)。我现在明白了。当他向我们展示如何删除记录时,我被本教程弄糊涂了。
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).