php - MYSQL插入到重复的键值

标签 php mysql sql linux

我有两个表 X 和 Y。它们都有共同的“名称”列。

X 的列是

  1. id(自增) - 主键
  2. 姓名
  3. 电子邮件
  4. 值(value)。

Y 的列是

  1. id(自增) - 主键
  2. 姓名
  3. 性别
  4. 工资

X 中有一些行在 Y 中不存在。我想将那些缺失的行插入到 Y 中。除此之外,我还想更新 Y 中与 X 中的记录同名的现有记录。

我正在尝试运行以下查询。

INSERT INTO Y (name, sex, salary) 
SELECT X.name, 'FEMALE' AS sex, '1000' AS salary 
FROM X LEFT JOIN Y ON X.name=Y.name 
WHERE X.email LIKE '%@test.com' 
ON DUPLICATE KEY UPDATE sex='MALE';

但是当我运行这个查询时,它没有更新表 Y 中具有相同名称的现有记录,而是插入了新记录。

所以我想知道“On DUPLICATE KEY UPDATE”是否只使用主键进行比较。是否可以在该子句中给出任何不同的列(名称)。

最佳答案

如下所示更改您的查询。比较发生在主键列或(一组)列的唯一约束上。如果插入的行会导致 UNIQUE 索引或 PRIMARY KEY 中出现重复值,则会对旧行执行 UPDATE。参见 Documentation获取更多信息。

INSERT INTO Y (name, sex, salary) 
SELECT X.name, 'FEMALE' AS sex, '1000' AS salary 
FROM X LEFT JOIN Y ON X.name=Y.name 
WHERE X.email LIKE '%@test.com' 
AND Y.name IS NULL
ON DUPLICATE KEY UPDATE Y.sex='MALE';

(或)将它们分成两个查询,如 INSERT

INSERT INTO Y (name, sex, salary) 
SELECT X.name, 'FEMALE' AS sex, '1000' AS salary 
FROM X LEFT JOIN Y ON X.name = Y.name 
WHERE X.email LIKE '%@test.com' 
AND Y.name IS NULL;

执行UPDATE

UPDATE Y 
JOIN X ON X.name = Y.name
 SET Y.sex='MALE'
WHERE X.email LIKE '%@test.com';

关于php - MYSQL插入到重复的键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32401186/

相关文章:

php - 在何处插入 MySQL 和 PHP

php - Jquery 自动完成与 mysql UTF8 不起作用

MySQL根据同一表中的一列中的条件合并属于同一ID的表中的行

php - 下拉列表中的值未传递到 Laravel php 中的 Controller

PHP代码为大家展示相同的代码

查询 "undefined"列 (?) 时出现 SQL 错误

mysql - 3个表之间的SQL多重测试

javascript - Php 简单的 html dom 删除具有特定类的 div

mysql - 可以将非顺序 ID 作为数据库中表的主键吗?

php - 类循环依赖