我有两个表 X 和 Y。它们都有共同的“名称”列。
X 的列是
- id(自增) - 主键
- 姓名
- 电子邮件
- 值(value)。
Y 的列是
- id(自增) - 主键
- 姓名
- 性别
- 工资
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/