【问题标题】:updating row with duplicates value使用重复值更新行
【发布时间】:2014-01-21 09:21:40
【问题描述】:

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

【问题讨论】:

  • 防御方法是首先检查“将是”重复项。
  • @Flosculus 如果我检查表格,则不会有重复,但可能会更新将创建重复..如何检查
  • 更新不能复制它,据我所知,唯一约束会阻止它。
  • 您不是在检查多个行,而是在检查您要插入的数据是否已经存在。

标签: php mysql sql select duplicates


【解决方案1】:

通常添加带有一些条件和可选处理的 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)

如果我有第三个用户,如果其他两个用户尝试类似地将值设置为“1234567”,则该用户可能具有值“1234567duplicates2”:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2021-04-12
    相关资源
    最近更新 更多