sql - 在 MySQL 中盲目使用 INSERT 有缺点吗?

标签 sql mysql

我经常想向表中添加一个值,或者在其键已存在时更新该值。这可以通过多种方式实现,假设在示例中的“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, ... ]

关于sql - 在 MySQL 中盲目使用 INSERT 有缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/149796/

相关文章:

mysql - 一次查询多项数据校验

mysql - Eclipse 在添加 MySql jdbc 驱动程序时出错

MySQL 存储过程不工作并且发生列计数错误

php - 在保存到数据库之前我应该​​担心 Richtext 编辑器的内容吗?

sql - CREATE TABLE AS SELECT 杀死 MySQL

sql - 通过 Oracle SQL 中的变量传递时间间隔

sql - 如何使用 sum 和 count 函数

mysql (copy) insert into from select 并添加一个别名列

MySQL 8.0 使用 LEFT JOIN 返回 0 行,而不是返回具有 0 列值的 1 行

php - 如何在PHP中使用foreach循环MYSQL月at将月份添加到+1个月?