插入到mysql数据库中,如果记录已存在,则更新

时间:2011-05-08 22:27:27

标签: mysql sql merge upsert

  

可能重复:
  How do I update if exists, insert if not (aka upsert or merge) in 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 个答案:

答案 0 :(得分: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. 如果家庭#77中不存在Aamna,则添加新行。
  2. 或更新Aamna的性别和生日,如果她之前已被添加。
  3. 这种结构比MySQL的REPLACE更强大,因为它允许你对冲突的行做一些不同的事情,而不仅仅是用你试图插入的东西覆盖它。当然,大多数时候REPLACE的功能是实际需要的。但最好知道更通用的陈述。

答案 1 :(得分:1)

尝试以下方法:

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

答案 2 :(得分:0)

检查案例中的行数:

SELECT * where ...

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