首页 文章

MYSQL插入重复的键值

提问于
浏览
1

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

X的列是

  • id(自动增量) - 主键

  • 名字

  • 电子邮件

  • 值 .

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中具有相同名称的现有记录,而是插入新的记录 .

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

1 回答

  • 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';
    

相关问题