【发布时间】:2010-07-06 04:06:25
【问题描述】:
人们对执行以下查询的最高效方式有何看法:
三列表格
如果
col_1和col_2值的组合已经存在UPDATE col_3else
INSERT新行
如果 UPDATE ON DUPLICATE KEY (我以前从未使用过),我假设我需要某种类型,但是我没有“KEY”,而是有一对两个值(列)来制作密钥......
【问题讨论】:
标签: mysql
人们对执行以下查询的最高效方式有何看法:
三列表格
如果col_1和col_2值的组合已经存在UPDATE col_3
else INSERT 新行
如果 UPDATE ON DUPLICATE KEY (我以前从未使用过),我假设我需要某种类型,但是我没有“KEY”,而是有一对两个值(列)来制作密钥......
【问题讨论】:
标签: mysql
您可以在 MySQL 中从多个列(称为复合键)中创建一个 PRIMARY 或 UNIQUE 键,这将允许 ON DUPLICATE KEY 正常工作。
// create a composite index
CREATE INDEX my_composite_index ON my_table (column1, column2);
// insert or update
INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2') ON DUPLICATE KEY UPDATE column3=column3+1;
【讨论】:
最有效的方法是创建 UNIQUE KEY 并使用 ON DUPLICATE KEY UPDATE。
较慢的方法是:
锁桌
SELECT TABLE(无论如何您都需要一个索引以获得最佳性能)
如果存在,更新
否则插入
解锁表格
【讨论】:
编辑:忽略我的建议
您可以像 ceejayoz 所说的那样使用复合键,但是我认为您需要 REPLACE INTO 而不是 UPDATE ON DUPLICATE KEY 因为如果没有找到重复项,REPLACE 也会插入。
注意:我不知道 UPDATE ON DUPLICATE KEY 的工作原理,但听起来它不执行插入操作。
【讨论】:
ON DUPLICATE KEY UPDATE 实际上仅用于 INSERT 查询。 dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html REPLACE INTO 是一个糟糕的选择,因为它不允许您只更新一两个字段 - 您必须为整行指定值。