INSERT ON DUPLICATE KEY:一起添加值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了INSERT ON DUPLICATE KEY:一起添加值相关的知识,希望对你有一定的参考价值。
我需要更改包含日期和金额的SQL表的日期列,例如, 20170101
到20170102
。然而,可能是新日期20170102
已经存在的情况。这会导致重复键错误,因为日期列是唯一索引的一部分。
我的第一个想法是使用INSERT ON DUPLICATE KEY:
INSERT INTO table (Date, Amount)
SELECT '20170102', Amount
FROM table
WHERE Date = '20170101'
ON DUPLICATE KEY UPDATE Amount = OldAmount + NewAmount
部分Amount = OldAmount + NewAmount
显然无法正常工作。但是我怎样才能解决我的问题呢?
答案
这是你的答案:假设旧表TABLE1(DATE1 DATE PRIMARY KEY,AMOUNT INT);
- 将新列Date2添加为DATE: ALTER TABLE TABLE1 ADD COLUMN DATE2 DATE;
- 按旧日期生成所有DATE2; UPDATE TABLE1设置DATE2 = DATE1; - 旧列DATE1或DATE
- 更新DATE2,记录您要更新DATE UPDATE TABLE1 SET DATE2 ='20170101',其中DATE1 ='20170102'; - 假设20170101已经存在
- 获取额外金额的记录 SELECT DATE2,TABLE1组的sum(AMOUNT)乘以1; - 这将显示所有记录的总和
- 您可以创建新表TABLE2并插入这些记录: CREATE TABLE TABLE2(DATE1 DATE PRIMARY KEY,AMOUNT int); INSERT INTO TABLE2 SELECT DATE2,SUM(AMOUNT)FROM TABEL1 GROUP BY 1;
另一答案
如果您正在使用SQL Server,请尝试合并语句。
只是为了澄清 - 您是否需要更改表中记录的日期或只是添加新记录?
CREATE TABLE #DataTable
(
SomeDate DATE,
Amount INT
)
INSERT #DataTable
VALUES
('20170101', 1),
('20170206', 2),
('20170309', 3),
('20170422', 4),
('20170518', 5)
DECLARE @NewValues TABLE
(
SomeDate DATE,
Amount INT
)
INSERT @NewValues
VALUES
('20170101', 10), --Update
('20170309', 15), --Update
('20170612', 6), --Insert
('20170725', 7) --Insert
MERGE INTO #DataTable AS tgt
USING @NewValues AS nv
ON nv.SomeDate = tgt.SomeDate
WHEN NOT MATCHED THEN INSERT
VALUES
(nv.SomeDate, nv.Amount)
WHEN MATCHED THEN UPDATE
SET tgt.Amount = tgt.Amount + nv.Amount
OUTPUT $action AS MergeAction,
Inserted.SomeDate,
Deleted.Amount AS OldValue,
Inserted.Amount AS NewValue;
DROP TABLE #DataTable;
以上是关于INSERT ON DUPLICATE KEY:一起添加值的主要内容,如果未能解决你的问题,请参考以下文章
mysql INSERT ... ON DUPLICATE KEY UPDATE语句
Db2 iseries INSERT ON DUPLICATE KEY
INSERT..ON DUPLICATE KEY UPDATE 语句中的锁定如何工作?
MySQL INSERT ON DUPLICATE KEY UPDATE