问题描述
我有一个表,我试图向其中添加以下约束,以避免在插入约束列的重复项时出现重复,但是我不确定如何使它不会完全导致插入失败如果要插入多行,则重复插入尝试。
这是我要添加的约束:
BEGIN
IF NOT EXISTS (SELECT * FROM sys.tables where name = N'T_1321_PNAnnotationCommitReport')
BEGIN
CREATE TABLE AnnotationCommitReport (
[id] [INT] IDENTITY(1,1) PRIMARY KEY not null,--key
[progressnote_id] [INT] NOT NULL,[form_id] [INT] NOT NULL,[question_id] [INT],[question_value] [VARCHAR](max),[associatedconcept_id] [INT],[OI_create_date] [DATETIME],--SCHED_RPT_DATE
[crte_date] [DATETIME] DEFAULT CURRENT_TIMESTAMP,);
--create unique constraint on indicated columns to prevent dups inserted
ALTER TABLE AnnotationCommitReport
ADD CONSTRAINT PN_Unique UNIQUE (progressnote_id,form_id,question_id,question_value,associatedconcept_id,OI_create_date)
END
这是我在其中添加可以重复的行的地方:
INSERT INTO AnnotationCommitReport(progressnote_id,OI_create_date,crte_date)
SELECT progressnote_id,questionvalue,concept_id,create_date as OI_create_date,getdate()
FROM FORM_QUESTION
WHERE
(create_date > @LAST_RUN_DATE
AND
create_date <= @RUN_TO_DATE)
END --it's much more complicated than this,so I simplified for this example
如何使其不插入重复的行?有人建议使用try / catch,但我认为如果在重复行之后有要插入的行,它将防止其余部分被插入。我找到了postgresql - avoid duplicate inserts without unique constraint,但不确定是否可以使用它,也不确定他们在谈论地图,以及如何将其应用于我拥有的地图。
更新:这是最后一个插入内容的详细信息,比我最初提供的要多:
INSERT INTO dbo.AnnotationCommitReport(progressnote_id,crte_date)
SELECT progressnote_id,a.form_id,fq.concept_id,a.create_date as OI_create_date,getdate()
FROM (
SELECT form_id,progressnote_id,R.Q.value('@id','varchar(max)') AS questionid,R.Q.value('@value','varchar(max)') AS questionvalue,t.create_date
FROM
@tableNotes t
OUTER APPLY t.form_questions.nodes('/RESULT/QUESTIONS/QUESTION') AS R(Q)
WHERE
ISNUMERIC(R.Q.value('@id','varchar(max)')) <> 0
) a
INNER JOIN [CKOLTP_DEV]..FORM_QUESTION fq ON
fq.form_id = a.form_id AND
fq.question_id = a.questionid
WHERE
(a.create_date > @LAST_RUN_DATE
AND
a.create_date <= @RUN_TO_DATE)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)