FK约束错误头痛 - SQL Server

时间:2015-07-22 11:19:12

标签: sql-server foreign-keys foreign-key-relationship

对于我试图将Access数据库迁移到SQL数据库的项目。

为此,我使用Access数据库创建了一个链接服务器,并创建了一个脚本,将Access中的数据插入到SQL数据库中。创建的脚本是使用每个插入的try catch创建的,因此表的排序无关紧要。为了给出一个想法,在2个表(总共130个表)的脚本下面,将数据插入SQl:

SET NOCOUNT ON

DECLARE @Rows AS INT

-- ****************************************************************************
-- ID = 1
IF NOT EXISTS (select * from TableInserted where ID = 1)
BEGIN
    PRINT '~UpdateDB:'
    BEGIN TRY
        BEGIN TRANSACTION

            INSERT INTO [~UpdateDB](
            --   [SSMA_TimeStamp],

                [StepID], 
                [SQLInstruction], 
                [Description], 
                [Customer], 
                [InsertDateTime], 
                [InsertUserID], 
                [ExecutedateTime]
            )
            SELECT 
                [StepID], 
                [SQLInstruction], 
                [Description], 
                [Customer], 
                [InsertDateTime], 
                [InsertUserID], 
                [ExecutedateTime]
            FROM [OPS_VSS_LINKED]...[~UpdateDB]

            SELECT @Rows = @@ROWCOUNT
            PRINT CAST(@Rows as NVARCHAR(10)) + ' Inserted'
        COMMIT TRANSACTION
        INSERT INTO TableInserted( ID, TableName, RowsInserted) VALUES  (1,'~UpdateDB', @Rows)
    END TRY
    BEGIN CATCH
            PRINT ERROR_MESSAGE()
        ROLLBACK TRANSACTION
    END CATCH
END

-- ****************************************************************************
-- ID = 2
IF NOT EXISTS (select * from TableInserted where ID = 2)
BEGIN
    PRINT '~VAN SLUISVELD Origineel:'

    SET IDENTITY_INSERT dbo.[~VAN SLUISVELD Origineel] ON

    BEGIN TRY
        BEGIN TRANSACTION

            INSERT INTO [~VAN SLUISVELD Origineel](


                [ID], 
                [a]
            )
            SELECT 
                [ID], 
                [a]
            FROM [OPS_VSS_LINKED]...[~VAN SLUISVELD Origineel]

            SELECT @Rows = @@ROWCOUNT
            PRINT CAST(@Rows as NVARCHAR(10)) + ' Inserted'
        COMMIT TRANSACTION
        INSERT INTO TableInserted( ID, TableName, RowsInserted) VALUES  (2,'~VAN SLUISVELD Origineel', @Rows)
    END TRY
    BEGIN CATCH
            PRINT ERROR_MESSAGE()
        ROLLBACK TRANSACTION
    END CATCH

    SET IDENTITY_INSERT dbo.[~VAN SLUISVELD Origineel] OFF

END

所以这个脚本只会在尚未完成的情况下插入数据(请查看TableInserted)。如果插入生成错误,则它将在特定表上回滚。

这一切都很好但是访问数据库被破坏了(因为desingnin不好)。

我得到50多个FK错误,特别是我被困在这个错误上:

Relaties:
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Relaties_Tariefnummers". The conflict occurred in database "OPS-VSS", table "dbo.Tariefnummers", column 'Tariefnummer'.
Tariefnummers:
The INSERT statement conflicted with the FOREIGN KEY constraint "Tariefnummers$RelatiesTariefnummers". The conflict occurred in database "OPS-VSS", table "dbo.Relaties", column 'RelatieNummer'.

多个FK errorsRelaties表一起使用,所以我想先让我们解决这个问题。 上面你可以看到Relaties表由于FK error表上的TariefNummers而无法插入,这并不奇怪,因为那个特定的表还没有得到它的数据,因为那个表也是有一个FK error

因此,对我来说,下一个合乎逻辑的事情是修复TariefNummers表上的FK错误。虽然TariefNummers上的FK错误与Relaties表相关联......所以他们互相喋喋不休..任何线索如何解决这个问题?我应该删除1个FK(在TariefNummers上),这不是首选。

虽然我可能会离开,但有些指针会受到赞赏!

1 个答案:

答案 0 :(得分:1)

可能有正当理由想要让两个表互相拥有外键,但是你怎么能够首先将数据放入其中呢?

要填充表格,您必须至少暂时删除或忽略其中一个外键,直到填充两个表格。