我创建了这个将数据插入数据库的过程,这很好用。现在我想创建一个阻止插入重复行的触发器。我正在使用SQL Server 2008
ALTER PROCEDURE [dbo].[AddEmployee]
@Stu_id nvarchar(50),
@Status int,
@Time nvarchar(50),
@Date nvarchar(50),
@Sub_id nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Attendanc (Stu_id, Status, Timing, Dates, Sub_id )
VALUES (@Stu_id, @Status, @Time, @Date, @Sub_id)
END
答案 0 :(得分:1)
正如评论中所建议的那样,触发器不适合您想要的工作。为防止表格中出现重复数据,您应在不应复制的列上添加unique constraint。
另一种选择是添加unique index而不是唯一约束。这对于优化select语句很有用,但可能会对更新或插入数据产生不良影响。
添加唯一约束或索引后,
任何将重复数据插入这些列的尝试都会导致sql server引发错误
注意:如果更新结果将导致这些列具有重复数据,您也将无法更新行。
那你怎么避免这些错误呢? 在插入数据之前,先在程序中添加一个检查 - 如下所示:
-- Assuming the unique constraint is on columns Status and Sub_id
IF NOT EXISTS(SELECT 1 FROM Attendanc WHERE Status = @Status AND Sub_id = @Sub_id)
BEGIN
INSERT INTO Attendanc (Stu_id, Status, Timing, Dates, Sub_id )
END
更新语句可能有点棘手,但仍有可能(这是一个简单的例子):
-- Still assuming the unique constraint is on columns Status and Sub_id
UPDATE A
SET A.Status = @Status
FROM Attendanc A INNER JOIN Attendanc B ON(A.Sub_id = B.Sub_id)
WHERE A.Stu_id = @Stu_id
AND B.Status <> @Status
仅当值不违反多列唯一约束时(在Status和Sub_Id上),这将更新Status列