我有一张桌子,就像下面的桌子一样。
这是一个价格表名称price_data
,其中包含唯一键DateTime
和值price
。
+----------+-------+
| DateTime | price |
+----------+-------+
|2018-01-01| 100.2 |
|2018-01-02| 101.5 |
+----------+-------+
我想同时将多个价格数据插入表格中。 因此,我可以使用以下SQL来实现这一点。
仅插入两行。
INSERT INTO `price_data` (`DateTime`, `price`) VALUES
('2018-01-03', 100.0),
('2018-01-04', 101.2);
P.S。在实际情况下,我将同时插入100多行。
上述SQL对于该任务来说是完全可以的。
但是,如果要插入的数据已在表中。例如:('2018-01-02', 101.5)
。由于密钥已经存在,因此发生错误。
我找到了解决问题的两种方法。
INSERT IGNORE
INSERT ... ON DUPLICATE KEY UPDATE
在第一种情况下,它可以工作并且不显示任何错误消息。但是,根据post,INSERT IGNORE
将隐藏所有错误,而不是唯一重复的密钥。
INSERT IGNORE INTO `price_data` (`DateTime`, `price`) VALUES
('2018-01-02', 101.5),
('2018-01-03', 100.0);
在第二种情况下,它可以正常工作,并且也不会打印任何错误消息。
但是,SQL会更新至少一列,这是一个副作用。因为如果行存在,我不想更新任何列,所以我将密钥DateTime
更新为新的DateTime
。由于DateTime
将等于新的DateTime
,因此表中没有任何变化。
INSERT INTO `price_data` (`DateTime`, `price`) VALUES
('2018-01-02', 101.5),
('2018-01-03', 100.0);
ON DUPLICATE KEY UPDATE DateTime=VALUES(DateTime);
第二种方法更好吗?
还有其他方法可以做到这一点并减少时间吗?
非常感谢您。