gpt4 book ai didi

php - 用重复值更新行

转载 作者:行者123 更新时间:2023-11-30 23:08:16 24 4
gpt4 key购买 nike

如果我有一个包含 2 列的表,如果我要更新该表中创建重复行的列,该表也有唯一约束,有什么方法可以在我创建唯一行时更新我可以处理该行吗?

最佳答案

通常,添加带有某些条件和可选处理的 SQL 内联 IF 语句以及检测重复的自连接就可以满足您的需求。真正的答案将特定于您的结构,但我将举一个名为 user 的表的示例,该表的一个名为 id 的列是主键和 SSN 对它有唯一的约束。我们将用 2 个用户填充它并更新其中一个以复制唯一 ssn 列中的第一个用户”

CREATE TABLE `test`.`user` (
`id` INT NOT NULL,
`SSN` VARCHAR(45) NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `ssn_UNIQUE` (`SSN` ASC));

INSERT INTO user VALUES (1, "1234567"), (2, "0123456");

正如您所注意到的,如果我在另一个用户(其中​​ id=1)已经拥有 SSN="1234567"时运行以下更新,那么我们将不会进行任何更新。

UPDATE user SET SSN="1234567" WHERE id=2;

ERROR 1062 (23000): Duplicate entry '1234567' for key 'ssn_UNIQUE'

但是,请考虑以下内容:

UPDATE user u 
LEFT JOIN user AS u2
ON u2.SSN="1234567"
SET u.SSN=IF(
u2.id IS NOT NULL,
CONCAT(u2.SSN, "duplicates", u2.id, "onto", u.id),
"1234567")
WHERE u.id=2;

Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

在上面的示例中,可能会出现以下情况:

如果用户 id=1 已经有 SSN="1234567",并且我运行上面的更新,结果将是:

SELECT * FROM test.user;
+----+--------------------------+
| id | SSN |
+----+--------------------------+
| 2 | 1234567duplicates1onto2 |
| 1 | 1234567 |
+----+--------------------------+
2 rows in set (0.00 sec)

如果我尝试改为设置为“01234567”,并且我运行上面相同的更新,结果将是:

SELECT * FROM test.user;
+----+----------+
| id | SSN |
+----+----------+
| 2 | 01234567 |
| 1 | 1234567 |
+----+----------+
2 rows in set (0.00 sec)

If I had a 3rd user, that user might possibly have the value "1234567duplicates2" if two other users had attempts at setting the value to "1234567" similarly:

SELECT * FROM test.user;
+----+-------------------------+
| id | SSN |
+----+-------------------------+
| 1 | 1234567 |
| 2 | 1234567duplicates1onto2 |
| 3 | 1234567duplicates1onto3 |
+----+-------------------------+
3 rows in set (0.00 sec)

如您所见,“onto”部分允许我在同一个更新批处理中有很多重复项。

要采用这种技术,只需将内联 IF 的输出更改为您将用于处理的公式,并且 JOIN 的标准应该是任何可以提供重复检测的内容。

http://dev.mysql.com/doc/refman/5.1/en/control-flow-functions.html

关于php - 用重复值更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20908175/

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