1

可能重复:
如果存在,我如何在 MySQL 中更新,如果不插入(又名 upsert 或合并)?

如何插入mysql数据库,如果记录已经存在,那么更新...我知道这个页面上有一个解决方案:http: //dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate .html

同胞表

+=======================================================+
| 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;
4

3 回答 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_id和上放置一个唯一的复合键sib_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是真正想要的。但最好知道更通用的陈述。

于 2011-05-09T00:49:41.970 回答
1

尝试以下操作:

REPLACE INTO sib_table (std_id,sib_name,sib_sex,sib_age) 
VALUES ('77','Aamna','f','1/27/2005')
于 2011-05-09T00:27:48.657 回答
0

检查案例中的行数:

SELECT * where ...

if (number of rows == 0) {
   INSERT ...
} else {
   Update ...
}
于 2011-05-08T22:35:32.983 回答