2015-09-04 179 views
1

我有兩個表X和Y.他們都有'名稱'共同的列。MYSQL插入到重複的鍵值

X的列是

  1. ID(自動增量) - 主鍵
  2. 電子郵件
  3. 值。的Y

列是

  1. ID(自動增量) - 主鍵
  2. 工資

有在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同名更新現有記錄此查詢,它插入新的。

所以我想知道「在重複密鑰更新」只使用主鍵進行比較。是否可以在該子句中給出任何不同的列(名稱)。

+0

你配置表中的唯一索引?添加一個新的唯一索引並添加將是唯一的列,然後它將相應更新而不創建新記錄。 –

+0

'name'是你的主鍵嗎?假設沒有(並且沒有意義的是性和薪水會是),那麼它會插入,因爲你沒有定義關鍵值,所以不會作爲一個騙子匹配。 –

+0

「名稱」不是主鍵。那麼這是否意味着使用ON DUPLICATE KEY UPDATE命令更新記錄是不可能的? – Pattu

回答

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

(OR)兩個查詢,如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'; 
+0

我嘗試了第一種方法。正如預期的那樣,它只從X中插入了行中缺少的行,但對於已經存在於Y中具有相同名稱的行,它沒有更新這些值。是否有可能基於名稱列(不是主鍵)在同一查詢中更新現有記錄? – Pattu

+0

@Pattu,就像上面說的'On Dup Key'那樣,鍵列和這裏的'name'的比較不是關鍵列。因此,要麼將'name'作爲關鍵列(或者)通過分隔插入/更新來求助於第二種方法。 – Rahul

+0

然後我遵循第二種方法。感謝您的澄清。 – Pattu