2011-05-08 112 views
1

可能重複:
How do I update if exists, insert if not (aka upsert or merge) in MySQL?插入到mysql數據庫,如果記錄已經存在,則更新

如何插入MySQL數據庫,如果記錄已經存在,則更新...我知道本頁有解決方案: http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

sib_table

+=======================================================+ 
| sib_id | std_id | sib_name | sib_sex | sib_age | 
+=======================================================+ 
| 1  | 77  | Sajjad | m  | 5/17/1990 | 
| 1  | 77  | Farah  | f  | 9/14/1980 | 
| 1  | 77  | Bilal  | m  | 1/10/1995 | 
+=======================================================+ 

如果我想爲此表添加花葯兄弟會是什麼樣的SQL。行的情況下

INSERT INTO sib_table 
    (std_id,sib_name,sib_sex,sib_age) 
VALUES ('77','Sajjad','m','1/5/2010') 
ON DUPLICATE KEY 
    UPDATE id = LAST_INSERT_ID(id), c = 3; 

INSERT INTO sib_table 
    (std_id,sib_name,sib_sex,sib_age) 
VALUES 
    ('77','Aamna','f','1/27/2005') 
ON DUPLICATE KEY 
    UPDATE id = LAST_INSERT_ID(id), c = 3; 

回答

3

你靠近,但你需要治療ON DUPLICATE KEY條款就像一個UPDATE聲明。這意味着你需要安裝一個獨特的鍵,以便試圖做:

INSERT INTO sib_table (std_id,sib_name,sib_sex,sib_age) 
VALUES ('77','Sajjad','m','1/5/2010') 

...只會工作一次。然後,您添加ON DUPLICATE KEY UPDATE子句來更改其餘字段(即不是該鍵的一部分)以匹配。因此,例如,假設我正確讀取了表結構,如果在列std_idsib_name上放置了一個唯一的組合鍵,這將確保您不能添加兩個同名的兄弟。而意味着,當你去添加另一個像這樣:

INSERT INTO sib_table (std_id,sib_name,sib_sex,sib_age) 
VALUES ('77','Aamna','f','1/27/2005') 
ON DUPLICATE KEY 
    UPDATE sib_sex = 'f', sib_age = '1/27/2005' 

...它會做兩兩件事之一:

  1. 添加新行如果Aamna不存在家庭#77。
  2. 或更新Aamna的性別和生日,如果她之前已被添加。

這種結構比MySQL的REPLACE,因爲它可以讓你做一些不同的衝突行不僅僅是與你試圖插入什麼覆蓋它更強大。當然,大多數情況下REPLACE的功能是實際需要的。但最好能夠知道更通用的說法。

+0

..非常感謝你讓我理解這個查詢..但是這是怎麼回事查詢知道...它的'唯一的名稱,我們不需要重複... ...我想,如果我們更新「名稱和性別」,那麼重複將與年齡綁定...正確...? ?? 其實sib_id是.. 1,2,3 ...但是寫錯了(1,1,1) – MFarooqi 2011-05-10 15:44:30

+0

這個方法只是增加了......沒有更新 – MFarooqi 2011-05-10 16:27:18

+0

如果你做'ALTER TABLE sib_table ADD UNIQUE KEY(std_id,sib_name)''那麼你不能添加第二個兄弟同一個std_id下的同名。然後我提供的SQL將正確更新。 – staticsan 2011-05-11 01:15:20

0

支票號碼:

SELECT * where ... 

if (number of rows == 0) { 
    INSERT ... 
} else { 
    Update ... 
} 
+0

但我想在您的選擇案例中包含「重複密鑰」功能 – MFarooqi 2011-05-08 22:43:04

+0

? – Atticus 2011-05-08 22:43:56

+0

@jobsz ..其實我想學習上面INSERT INTO WITH UPDATES語句...你能幫我在那... – MFarooqi 2011-05-08 23:04:30

1

嘗試以下操作:

REPLACE INTO sib_table (std_id,sib_name,sib_sex,sib_age) 
VALUES ('77','Aamna','f','1/27/2005') 
相關問題