FK 约束错误头痛 - SQL 服务器
FK Constraint error Headache - SQL Server
对于一个项目,我正在尝试将 Access 数据库迁移到 SQL 数据库。
为此,我创建了一个带有 Access 数据库的链接服务器,并创建了一个脚本,用于将 Access 中的数据插入到 SQL 数据库中。创建的脚本是用每个插入的 try catch 制作的,因此 tables 的顺序无关紧要。为了给出一个想法,在将数据插入 SQl:
的 2 tables(总共 130 tables)脚本下方
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)。如果插入产生错误,那么它将在特定 table 上回滚。
一切正常,但访问数据库已损坏(设计错误的原因)。
我遇到了 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 errors
与 Relaties
table 相关,所以我认为让我们先解决这个问题。
在上面你可以看到 Relaties
table 由于 TariefNummers
table 上的 FK error
而无法插入,这并不奇怪,因为特定的 table没有它的数据,因为 table 也有一个 FK error
。
所以对我来说下一个合乎逻辑的事情是修复 TariefNummers
table 上的 FK 错误。虽然 TariefNummers
上的 FK 错误与 Relaties
table 相关联...所以他们正在互相禁用.. 任何线索如何解决这个问题?我是否应该只删除 1 个不受欢迎的 FK(在 TariefNummers 上)。
虽然我可能离题太远了,但如果能给我一些指点,我们将不胜感激!
可能有充分的理由希望两个表彼此具有外键,但您如何才能首先将数据放入其中?
要填充表,您必须删除或忽略其中一个外键,至少是暂时的,直到两个表都被填充。
对于一个项目,我正在尝试将 Access 数据库迁移到 SQL 数据库。
为此,我创建了一个带有 Access 数据库的链接服务器,并创建了一个脚本,用于将 Access 中的数据插入到 SQL 数据库中。创建的脚本是用每个插入的 try catch 制作的,因此 tables 的顺序无关紧要。为了给出一个想法,在将数据插入 SQl:
的 2 tables(总共 130 tables)脚本下方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)。如果插入产生错误,那么它将在特定 table 上回滚。
一切正常,但访问数据库已损坏(设计错误的原因)。
我遇到了 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 errors
与 Relaties
table 相关,所以我认为让我们先解决这个问题。
在上面你可以看到 Relaties
table 由于 TariefNummers
table 上的 FK error
而无法插入,这并不奇怪,因为特定的 table没有它的数据,因为 table 也有一个 FK error
。
所以对我来说下一个合乎逻辑的事情是修复 TariefNummers
table 上的 FK 错误。虽然 TariefNummers
上的 FK 错误与 Relaties
table 相关联...所以他们正在互相禁用.. 任何线索如何解决这个问题?我是否应该只删除 1 个不受欢迎的 FK(在 TariefNummers 上)。
虽然我可能离题太远了,但如果能给我一些指点,我们将不胜感激!
可能有充分的理由希望两个表彼此具有外键,但您如何才能首先将数据放入其中?
要填充表,您必须删除或忽略其中一个外键,至少是暂时的,直到两个表都被填充。