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:一起添加值的主要内容,如果未能解决你的问题,请参考以下文章

mysql INSERT ... ON DUPLICATE KEY UPDATE语句

Db2 iseries INSERT ON DUPLICATE KEY

INSERT..ON DUPLICATE KEY UPDATE 语句中的锁定如何工作?

MySQL INSERT ON DUPLICATE KEY UPDATE

INSERT ... ON DUPLICATE KEY UPDATE Syntax

讲讲insert on duplicate key update 的死锁坑