MYSQL插入重复键值

时间:2015-09-04 15:02:28

标签: php mysql sql linux

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

X的列是

  1. id(自动增量) - 主键
  2. 名称
  3. 电子邮件
  4. 值。
  5. Y的列是

    1. id(自动增量) - 主键
    2. 名称
    3. 薪水
    4. 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上”只使用主键进行比较。是否可以在该子句中给出任何不同的列(名称)。

1 个答案:

答案 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';