Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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 使用重复值更新行_Php_Mysql_Sql_Select_Duplicates - Fatal编程技术网

Php 使用重复值更新行

Php 使用重复值更新行,php,mysql,sql,select,duplicates,Php,Mysql,Sql,Select,Duplicates,如果我有一个有两列的表,如果我要更新该表中创建重复行的列,该表也有唯一约束,如果在我更新时创建了唯一的行,有什么方法可以处理该行吗?通常添加一个带有一些条件和可选处理的SQL内联if语句,以及一个用于检测重复的自连接,就可以满足您的要求。真正的答案将特定于您的结构,但我将给出一个名为user的表的示例,该表有一个名为id的列,该列是主键,SSN对其具有唯一约束。我们将用2个用户填充它,并更新其中一个,以复制唯一ssn列中的第一个用户“ 正如您所注意到的,如果我在另一个用户(其中id=1)已经有S

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

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

正如您所注意到的,如果我在另一个用户(其中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)
SELECT * FROM test.user;
+----+----------+
| id | SSN      |
+----+----------+
|  2 | 01234567 |
|  1 | 1234567  |
+----+----------+
2 rows in set (0.00 sec)
如果我尝试改为设置为“01234567”,并运行上述相同的更新,结果将是:

SELECT * FROM test.user;
+----+--------------------------+
| id | SSN                      |
+----+--------------------------+
|  2 | 1234567duplicates1onto2  |
|  1 | 1234567                  |
+----+--------------------------+
2 rows in set (0.00 sec)
SELECT * FROM test.user;
+----+----------+
| id | SSN      |
+----+----------+
|  2 | 01234567 |
|  1 | 1234567  |
+----+----------+
2 rows in set (0.00 sec)
如果我有第三个用户,如果其他两个用户尝试将该值设置为“1234567 Duplicates2”,则该用户可能具有值“1234567 Duplicates2”:

正如您所看到的,“打开”部分允许我在同一更新批中有许多重复项

为了适应这种技术,只需将inline IF的输出更改为将用于处理的公式,并且连接的条件应该是提供重复检测的任何条件


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