- 编辑 -
我想我弄明白了这个问题。原始行正在更新而不是最新行,因此CreationDate
是相同的,因为ID + CreationDate
是主键,它返回违规。更新记录时有没有办法选择最新的行而不是原始行?
谢谢:D
----------------
我遇到了主键约束的错误违规,但我不知道为什么,因为我的主键值是唯一的。
我可以添加'Darren'的记录并更新一次。之后我得到了错误。我的触发器工作,当我更新现有记录时,原始记录和编辑记录都插入到表ProcessList中,以便我能够看到对所有记录所做的所有更改。
表:
CREATE TABLE dbo.ProcessList
(
TransactionID integer IDENTITY,
IsEdited bit DEFAULT 'FALSE',
ID integer NOT NULL,
Name varchar(30) NOT NULL,
Amount smallmoney NOT NULL,
CreationDate datetime DEFAULT GETDATE(),
ModificationDate datetime,
PRIMARY KEY (ID, CreationDate)
)
CREATE TABLE dbo.ProcessListHist
(
TransactionID integer IDENTITY,
IsEdited bit DEFAULT 'FALSE',
ID integer NOT NULL,
Name varchar(30) NOT NULL,
Amount smallmoney NOT NULL,
CreationDate datetime DEFAULT GETDATE(),
ModificationDate datetime,
PRIMARY KEY (ID, CreationDate)
)
触发:
CREATE TRIGGER CloneAfterUpdate ON ProcessList
AFTER UPDATE
AS
IF (UPDATE (Amount) OR UPDATE (NAME))
BEGIN
INSERT INTO ProcessListHist (ID, Name, Amount, CreationDate, ModificationDate, IsEdited)
SELECT
ID, Name, Amount, CreationDate, GETDATE(), 'True'
FROM deleted
UPDATE PL
SET PL.CreationDate = PLH.ModificationDate
FROM ProcessList PL
INNER JOIN deleted ON PL.ID = deleted.ID
AND PL.CreationDate = deleted.CreationDate
INNER JOIN ProcessListHist PLH ON PL.ID = PLH.ID
AND PLH.CreationDate = deleted.CreationDate
INSERT INTO ProcessList (ID, Name, Amount, CreationDate, ModificationDate, IsEdited)
SELECT
ID, Name, Amount, CreationDate, ModificationDate, IsEdited
FROM ProcessListHist
END
插入/更新语句:
INSERT INTO ProcessList (ID, Name, Amount) VALUES ('1020', 'Darren', '300')
UPDATE ProcessList SET Amount = 1000 WHERE Name = 'Darren'
答案 0 :(得分:0)
您是否在历史记录表上记录了一项交易?因此,您需要删除历史记录表的唯一ID。只设为TransactionID INT
,而不是标识,问题是因为每次执行UPDATE
时,记录都会插入到历史记录表中,因此如果记录已经存在意思是说,如果该ID已存在于历史记录表中,您不能插入相同的ID ,这就是您收到该错误的原因。