可能重复:
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;
答案 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_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'
......它会做两件事之一:
这种结构比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 ...
}