多个行上的唯一约束..如何在不停止所有操作的情况下不插入重复项

问题描述

我有一个表,我试图向其中添加以下约束,以避免在插入约束列的重复项时出现重复,但是我不确定如何使它不会完全导致插入失败如果要插入多行,则重复插入尝试。

这是我要添加的约束:

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 (将#修改为@)