2011-05-08 116 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') 
相关问题