【发布时间】:2021-08-16 16:26:52
【问题描述】:
我的存储过程中有如下语句:
IF (
SELECT COUNT(1)
FROM dbo.t_user_suggested
WHERE ListId = @pListId
) > 0
BEGIN
DELETE
FROM dbo.t_user_suggested
WHERE ListId = @pListId
END
INSERT INTO dbo.t_user_suggested (
Id
,InId
,InName
,UserId
,ListId
)
SELECT DISTINCT Id
,InId
,InName
,@pUserId
,@pListId
FROM CTE123
我收到错误违反主键约束“PK_t_user_suggested”。无法在对象“dbo.t_user_suggested”中插入重复键。在我插入之前,我有一个明确的检查来删除所有记录,这个错误是随机出现的。我手动执行了存储过程 10-15 次,没有出现错误。如何确保在控制转移到存储过程中的 Insert 之前删除所有记录。
【问题讨论】:
-
SQL 自上而下顺序执行,
INSERT将在DELETE之后执行。我怀疑您的DELETE没有删除您认为它是 或 的行,您在尝试插入的行中有重复值。花点时间创建一个minimal reproducible example,您可能会发现现有尝试的问题(这是您在提问时应该尝试创建一个的原因之一)。 -
@Larnu:这正是我造成问题的代码。我有一张包含数千行的表格,因此无法提供任何数据。我知道它很难重现它,因为我也有重现它的问题。我只是想知道在存储过程中在 T-SQL 中执行语句是否存在一些问题,这是一个非常棘手的问题。
-
@HoneyBadger:感谢您指出这一点。这是一个错字.. 不,我在表 t_user_suggested 上没有任何触发器
-
那么你表的主键定义是什么?
-
这张表的PK是什么是?我建议它是
Id,而不是ListId。由于我们不知道CTE123是什么,因此很难为您提供帮助
标签: sql-server tsql stored-procedures transactions