问题描述
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
)