我有两个表X和Y.它们都有共同的“名称”列。
X的列是
Y的列是
X中有一些行不存在于Y中。我想将这些丢失的行插入Y.除此之外,我还想更新Y中与X中记录同名的现有记录。 / p>
我正在尝试运行以下查询。
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中具有相同名称的现有记录,而是插入新的记录。
所以我想知道“在DUPLICATE KEY UPDATE上”只使用主键进行比较。是否可以在该子句中给出任何不同的列(名称)。
答案 0 :(得分:1)
更改您的查询,如下所示。是的,比较发生在主键列上。如果插入的行会导致UNIQUE index or 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';