我经常想要为表添加一个值,或者如果它的键已经存在则更新该值.这可以通过多种方式实现,假设在示例中的'user_id'和'pref_key'列上设置了主键或唯一键:
1.盲插,如果收到重复键错误则更新:
// Try to insert as a new value INSERT INTO my_prefs (user_id, pref_key, pref_value) VALUES (1234, 'show_help', 'true'); // If a duplicate-key error occurs run an update query UPDATE my_prefs SET pref_value = 'true' WHERE user_id=1234 AND pref_key='show_help';
2.检查是否存在,然后选择或更新:
// Check for existence SELECT COUNT(*) FROM my_prefs WHERE user_id=1234 AND pref_key='show_help'; // If count is zero, insert INSERT INTO my_prefs (user_id, pref_key, pref_value) VALUES (1234, 'show_help', 'true'); // If count is one, update UPDATE my_prefs SET pref_value = 'true' WHERE user_id=1234 AND pref_key='show_help';
第一种方式似乎更可取,因为它只需要一个新插入查询和两个更新,其中第二种方法总是需要两个查询.是否有任何我想念的东西虽然会盲目地插入一个坏主意?
看一下http://dev.mysql.com/doc/refman/5.0/en/insert-select.html中的ON DUPLICATE KEY语法
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
有第三种MySQL方式,它将是该RDBMS中的首选方式
INSERT INTO my_prefs (user_id, pref_key, pref_value) VALUES (1234, 'show_help', 'true') ON DUPLICATE KEY UPDATE pref_value = 'true'