gpt4 book ai didi

php - 使用mysql在某些条件下删除一行

转载 作者:行者123 更新时间:2023-11-29 08:52:49 26 4
gpt4 key购买 nike

如果满足某些条件,我希望在表(如下所示)获得新插入时自动删除行。

时间:

  • 有些行引用具有相同“user_id”的相同“字段”
  • 它们的“字段”、“显示”和“搜索”列相同

简单来说,当行变得重复时(“group_id”列除外),应删除非空“group_id”,否则应更新或插入行。

有没有办法在 mysql 中进行设置(本着“ON DUPLICATE do stuff”的精神与唯一键等相结合),或者我是否必须在 php 中显式检查它(有多个查询)?

附加信息:对于每个可能的“字段”,应该始终有一行带有 NULL“group_id”(有一个有限的集合,在其他地方定义)。另一方面,可能不存在非空“group_id”。

CREATE TABLE `Views` (
`user_id` SMALLINT(5) UNSIGNED NOT NULL,
`db` ENUM('db_a','db_b') NOT NULL COLLATE 'utf8_swedish_ci',
`field` VARCHAR(40) NOT NULL COLLATE 'utf8_swedish_ci',
`display` TINYINT(1) UNSIGNED NOT NULL,
`search` TINYINT(1) UNSIGNED NOT NULL,
`group_id` SMALLINT(6) UNSIGNED NULL DEFAULT NULL,
UNIQUE INDEX `user_id` (`field`, `db`, `user_id`),
INDEX `Views_ibfk_1` (`user_id`),
INDEX `group_id` (`group_id`),
CONSTRAINT `Views_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`) ON
UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_swedish_ci'
ENGINE=InnoDB;

最佳答案

我认为你需要修改一下你的逻辑。插入一行只是为了删除另一行是没有意义的。为什么不直接将重复行中的 Group_ID 字段更新为要插入的内容?下面是我将如何去做的一个粗略想法。

注意我没有对 MySQL 做过太多工作,无法让下面的代码在 SQLFiddle 上运行,但基于MySQL docs我不明白为什么。也许更精通 MySQL 的人可以纠正我?

SET @User_ID = 1;
SET @db = 'db_a';
SET @Field = 'Field';
SET @Display = 1;
SET @Search = 1;
SET @Group_ID = 1;

IF EXISTS
( SELECT 1
FROM Views
WHERE User_ID = @User_ID
AND DB = @DB
AND Field = @Field
AND Group_ID IS NOT NULL
)
THEN
UPDATE Views
SET Group_ID = @Group_ID,
Display = @Display,
Search = @Search
WHERE User_ID = @User_ID
AND DB = @DB
AND Field = @Field
AND Group_ID IS NOT NULL
ELSE
INSERT INTO Views (User_ID, DB, Field, Display, Search, Group_ID)
VALUES (@User_ID, @DB, @Field, @Display, @Search, @Group_ID)
END IF;

或者(也是我的首选解决方案),将时间戳字段添加到表中并创建一个 View ,如下所示:

SELECT  v.User_ID, v.DB, v.Field, v.Display, v.Search, v.Group_ID
FROM Views v
INNER JOIN
( SELECT User_ID, DB, Field, MAX(CreatedDate) AS CreatedDate
FROM Views
WHERE Group_ID IS NOT NULL
GROUP BY User_ID, DB, Field
) MaxView
ON MaxView.User_ID = v.User_ID
AND MaxView.DB = v.DB
AND MaxView.Field = v.Field
AND MaxView.CreatedDate = v.CreatedDate
WHERE v.Group_ID IS NOT NULL
UNION ALL
SELECT v.User_ID, v.DB, v.Field, v.Display, v.Search, v.Group_ID
FROM Views v
WHERE v.Group_ID IS NULL

这将使您能够正确跟踪数据更改,而不会影响查看唯一记录的需求。

关于php - 使用mysql在某些条件下删除一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10733326/

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