假设我的数据库中有 3 个表,如下所示:
Person
(personid
, ...) ---这是实体,personid
是标识列Phone
(phoneid
, ...) ---这是实体,phoneid
是标识列PersonPhone
(personid, phoneid
) ---这种关系
在向表中插入数据时,需要先向实体表中插入行并获取生成的id
,然后再向关系表中插入一行。
它工作正常。问题是:我有一个带有事务的存储过程,Try Catch
语句如下:
BEGIN TRY
declare aCursor cursor local fast_forward for (Select Query...)
open aCursor;
fetch next from aCursor into @variables....
while @@fetch_status = 0
begin
INSERT INTO Person(...);
set @personid =@@IDENTITY;
INSERT INTO Phone(...);
set @phoneid =@@IDENTITY;
INSERT INTO PersonPhone(@personid, @phoneid);
end;
END TRY
BEGIN CATCH
close aCursor;
deallocate selectdistributor;
SELECT ERROR_NUMBER() AS ErrorNumber,ERROR_MESSAGE() AS ErrorMessage;
ROLLBACK TRAN;
RETURN;
END CATCH
COMMIT;
close aCursor;
deallocate aCursor;
使用光标,将为人员、电话插入更多的一条记录。运行 SP 时,它会在关系上首次插入数据时停止。我也可以得到正确的@personid,@phoneid,但在交易完成之前,我收到错误 INSERT INTO PersonPhone(@personid, @phoneid); 作为:
INSERT 语句与 FOREIGN KEY 约束“Person_PersonPhone_FK1”冲突。冲突发生在数据库“MYDB”、表“dbo.Person”、列“PersonID”中。
看起来系统生成的 ID 在事务完成之前无法识别。
如何解决这个问题?