gpt4 book ai didi

php - 获取mysql中删除的主键列表

转载 作者:行者123 更新时间:2023-11-29 05:35:02 25 4
gpt4 key购买 nike

我有一个父表 A 具有以下属性(列){ PKA, a1, a2...} 和子表 B 具有以下属性 {FKA, b1, b2...}PKA 是表 A 的主键(自增),表 B 没有任何主键,但它有一个引用表 A 的 PKA 列的外键列 FKA(1:n 关系)

添加条目:当我在表 A 中添加一个条目时...我使用 PDO API lastInsertId() 来插入记录并使用此值填充表 B 中的 FKA。

问题:1. 然而,在删除条目时,我没有找到可以以类似方式使用的 API“lastDeleteId()”

更大的问题: 当我的删除发生在表 A 上时,根据设计,删除命令是:从表 A 中删除,其中 a1 = 。此 a1 列是非唯一的,因此 DELETE 命令可以返回需要从表 B 中清除的多个 PKA 键

注意事项:

  1. 我正在使用 PDO API
  2. MySQL 表(这里正在考虑)是 InnoDB
  3. 我在事务模式下运行(beginTransaction() 和 commit()/rollback() 之间的多个 SQL 调用
  4. 不寻找 CASCADE ON DELETE 选项

感谢您的指点。

最佳答案

您可以在删除查询后立即使用此查询,也可以将其用作批量清理方法,该方法将对未与依赖父级一起删除的任何子级进行追溯:

DELETE
FROM table_a
WHERE a1 = ?;
SELECT id
FROM table_b
WHERE FKA NOT IN(SELECT id FROM table_a);

或者您可以使用相同的 WHERE 子句在删除查询之前运行它:

START TRANSACTION;
SELECT id
FROM table_b
WHERE FKA NOT IN(
SELECT id
FROM table_a
WHERE a1 = ?;
);
DELETE
FROM table_a
WHERE a1 = ?;
COMMIT;

第二种方法需要包含在一个事务中,以确保您只删除在选择时匹配的 ID,即使其他线程可能输入了与这些过滤器匹配的新数据也是如此。

编辑 - 方法问题

如果您正在使用 $pdo->beginTransaction() 然后发出一个 SELECT 语句,获取 ID,在应用程序级别使用它们,然后发出 delete 语句,这将使事务保持事件状态,并且某些记录可能会锁定在该事务中,特别是如果您在初始 select 中使用 FOR UPDATE > 语句和/或如果您有高 ISOLATION LEVEL

如果您在应用层使用耗时的操作,这将在数据库中长时间保持事件锁,并降低您的应用程序的并发连接容量。

我擅长避免与数据库服务器进行多次通信 session ,只要一个就足够了。这就是为什么我不会首先使用 $pdo->beginTransaction() 的原因。

我会将“获取要删除的 ID”查询扩展为“获取处理已删除记录所需的所有数据”。我会在事务中的一个通信 session 中将查询发送到服务器,即使数据被删除,SELECT 语句的结果集也会被发送回应用程序在应用程序收到有效负载时从存储中取出。

关于php - 获取mysql中删除的主键列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11461126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com