仅当某些列不重复时才插入SQL Server表

问题描述

我有一个像这样的sql Server表:

CREATE TABLE [dbo].[Person]
(
    [ID] [uniqueidentifier] NOT NULL,[name] [uniqueidentifier] NOT NULL,[address] [nvarchar](50) NULL,[value] [nvarchar](max) NULL
    [date] [datetime] NOT NULL,CONSTRAINT [PK_Person] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
)

它的数据如下:

ID  name   address  value    date
-----------------------------------------------------
1   a      1         10      2020-08-27 06:06:29.833
2   b      2         30      2020-08-28 06:06:29.833
3   c      3         5       2020-08-27 06:06:29.833
4   d      4         30      2020-08-28 06:06:29.833

我正在对该表进行批量插入。插入时,我不想插入是否重复数据(名称,地址,值)。我想地插入数据。

因此,如果要插入的输入数据是:

ID  name   address  value    date
-----------------------------------------------------
5   e      5         10      2020-08-27 06:06:29.833
6   b      2         30      2020-08-29 06:06:29.833
7   c      3         5       2020-08-30 06:06:29.833
8   f      4         30      2020-08-28 06:06:29.833

然后仅插入ID为5和8的行,而ID为6和7的行将被视为重复行,不应作为新行插入,并且在最终表(名称,地址,值)中始终是唯一的。>

我的坏。输入数据不是来自表。 这是python中的列表。

list = [['e',5,10],['b',2,30],['c',3,5],['f',4,30]]

当前我的查询是:

insert_query = "INSERT INTO Person(ID,name,address,value,date) VALUES ( newID(),%s,getDate());"
cursor.executemany(insert_query,list)

我想要类似的东西

insert_query = "INSERT INTO Person(ID,getDate()) on duplicate(name,value) ignore that insert;"
cursor.executemany(insert_query,list)

解决方法

如果我正确地跟随您,则可以使用not exists

insert into person (name,address,value,date)
select x.*
from (values (@name,@address,@value,@date)) as x(name,date)
where not exists (
    select 1
    from person p1
    where p1.name = p.name and p1.address = p.address and p1.value = p.value
)