即使我在我的程序中删除了

时间:2018-01-03 08:23:57

标签: sql sql-server

即使我在我的程序中删除,也不能因主键双重性而多次插入表中。你能帮帮我们吗?

BEGIN
    IF @operace = 'v'
        DELETE
        FROM lcs.vztahy_formulare
        WHERE lcs.vztahy_formulare.zamid IN (
                SELECT crossTable.uzivatel
                FROM #tempCrossTable crossTable
                WHERE crossTable.uzivatel = lcs.vztahy_formulare.zamid
                    AND crossTable.cislo_vztahu = lcs.vztahy_formulare.cislo_vztahu
                    AND crossTable.cislo_poradace = lcs.vztahy_formulare.cislo_poradace
                    AND crossTable.strana = lcs.vztahy_formulare.strana
                    AND lcs.vztahy_formulare.type = 2
                )

    IF @operace = 'v'
        INSERT INTO lcs.vztahy_formulare
        SELECT crossTable.uzivatel
            ,crossTable.cislo_poradace
            ,crossTable.vztazeneVztahy
            ,0
            ,crossTable.strana
            ,1
            ,0
            ,2
        FROM #tempCrosstable crossTable
END

这是表结构

CREATE TABLE lcs.vztahy_formulare (
    zamid INT NOT NULL
    ,cislo_poradace INT NOT NULL
    ,cislo_vztahu INT NOT NULL
    ,poradi INT NOT NULL
    ,strana CHAR(1) NOT NULL
    ,relation_volume_type INT NOT NULL
    ,poradi_archiv INT NOT NULL
    ,type INT NOT NULL
    ,CONSTRAINT [PK_vztahy_formulare_1__30] PRIMARY KEY NONCLUSTERED (
        [zamid] ASC
        ,[cislo_poradace] ASC
        ,[cislo_vztahu] ASC
        ,[strana] ASC
        ) WITH (
        PAD_INDEX = OFF
        ,STATISTICS_NORECOMPUTE = OFF
        ,IGNORE_DUP_KEY = OFF
        ,ALLOW_ROW_LOCKS = ON
        ,ALLOW_PAGE_LOCKS = ON
        ) ON [PRIMARY]
    ) ON [PRIMARY]
GO

ALTER TABLE [lcs].[vztahy_formulare] ADD CONSTRAINT [DF__vztahy_fo__relat__7917DB30] DEFAULT((1))
FOR [relation_volume_type]
GO

ALTER TABLE [lcs].[vztahy_formulare] ADD CONSTRAINT [DF__vztahy_fo__porad__7A0BFF69] DEFAULT((0))
FOR [poradi_archiv]
GO

ALTER TABLE [lcs].[vztahy_formulare] ADD CONSTRAINT [DF__vztahy_for__type__3E77CEFD] DEFAULT((1))
FOR [type]
GO

lcs.vztahy_formulare。 zamid 等于#tempCrossTable。 uzivatel
lcs.vztahy_formulare。 cislo_vztahu 等于#tempCrossTable。 cislo_vztahu
lcs.vztahy_formulare。 cislo_poradace 等于#tempCrossTable。 cislo_poradace
lcs.vztahy_formulare。 strana 等于#tempCrossTable。 strana

从表lcs.vztahy_formulare

中选择数据
SELECT *
FROM lcs.vztahy_formulare f
WHERE f.zamid = 51048910

返回 data from lcs.vztahy_formulare(link on screenshot)

它返回3行(类型2)并且它是正确的。所以删除应该使用type = 2。

如果我想再次运行此插入,我必须通过简单的删除语句手动删除它。

DELETE
FROM lcs.vztahy_formulare
WHERE lcs.vztah_formulare.zamid = 51048910

1 个答案:

答案 0 :(得分:0)

似乎您在insert语句中使用了错误的字段:

INSERT INTO lcs.vztahy_formulare
        SELECT crossTable.uzivatel
            ,crossTable.cislo_poradace
            ,crossTable.cislo_vztahu
            ,0
            ,crossTable.strana
            ,1
            ,0
            ,2
        FROM #tempCrosstable crossTable