INSERT ON DUPLICATE KEY:一起添加值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了INSERT ON DUPLICATE KEY:一起添加值相关的知识,希望对你有一定的参考价值。

我需要更改包含日期和金额的SQL表的日期列,例如, 2017010120170102。然而,可能是新日期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);

  1. 将新列Date2添加为DATE: ALTER TABLE TABLE1 ADD COLUMN DATE2 DATE;
  2. 按旧日期生成所有DATE2; UPDATE TABLE1设置DATE2 = DATE1; - 旧列DATE1或DATE
  3. 更新DATE2,记录您要更新DATE UPDATE TABLE1 SET DATE2 ='20170101',其中DATE1 ='20170102'; - 假设20170101已经存在
  4. 获取额外金额的记录 SELECT DATE2,TABLE1组的sum(AMOUNT)乘以1; - 这将显示所有记录的总和
  5. 您可以创建新表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:一起添加值的主要内容,如果未能解决你的问题,请参考以下文章