CREATE TABLE Customer
(
customerID int identity (500,20) CONSTRAINT
.
.
dateCreated datetime DEFAULT GetDate() NOT NULL,
dateModified datetime DEFAULT GetDate() NOT NULL
);
当我插入记录时,dateCreated和dateModified设置为默认日期/时间。当我更新/修改记录时,dateModified和dateCreated保持不变?我该怎么办?
显然,我需要将dateCreated值保留为第一次插入时,dateModified会在记录字段中发生更改/修改时不断更改。
换句话说,你能写一个快速触发样本吗?我还不太了解......
答案 0 :(得分:10)
您可能希望查看创建更新触发器以便为您更新此值
看看像
这样的东西CREATE TABLE Vals(
ID INT,
Val VARCHAR(10),
DateCreated DATETIME DEFAULT GetDate(),
DateUpdated DATETIME DEFAULT GetDate()
)
GO
CREATE TRIGGER Upd ON Vals
AFTER UPDATE
AS
UPDATE Vals
SET DateUpdated = GetDate()
FROM Vals INNER JOIN
inserted ON Vals.ID = inserted.ID
Go
INSERT INTO Vals (ID, Val) SELECT 1, 'A'
SELECT *
FROM Vals
GO
UPDATE Vals SET Val = 'B'
SELECT *
FROM Vals
GO
DROP TABLE Vals
GO
答案 1 :(得分:4)
UPDATE
Customer
SET
... = NewValue,
dateModified = DEFAULT
WHERE
...
我会使用它而不是dateModified = GETDATE()
所以GETDATE()只使用一次(假设您希望将来更改为GETUTCDATE())
如果您有多个更新路径,可以触发......?
答案 2 :(得分:3)
当我插入记录时,dateCreated 和dateModified设置为默认值 约会时间。当我更新/修改 record,dateModified和dateCreated 保持原样?我该怎么办?
列默认值仅在INSERT
时使用,而不在UPDATE
时使用。如果您未提供列或在INSERT中发出DEFAULT
关键字,则INSERT命令将使用默认值。
INSERT INTO Customer (col1, col2)
VALUES (..,..) ---get default for dateCreated & dateModified
INSERT INTO Customer (col1, col2,dateCreated)
VALUES (..,..,DEFAULT) ---get default for dateCreated & dateModified
INSERT INTO Customer (col1, col2,dateCreated,dateModified)
VALUES (..,..,DEFAULT,DEFAULT) ---get default for dateCreated & dateModified
INSERT INTO Customer (col1, col2,dateCreated,dateModified)
VALUES (..,..,'1/1/2010',DEFAULT) ---only get default for dateModified
INSERT INTO Customer (col1, col2,dateCreated,)
VALUES (..,..,'1/1/2010') ---only get default for dateModified
INSERT INTO Customer (col1, col2,dateCreated,dateModified)
VALUES (..,..,'1/1/2010','1/2/2010') ---no defaults for dateCreated & dateModifie
我喜欢使用过程顶部的局部变量集:
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
然后我在程序中使用它,因此所有更改(即使在多个表上)都具有与毫秒完全相同的日期。我也更喜欢使用dateModified列来允许空值而不是默认值,当它被插入时,它已被创建而未被修改,我将在实际修改时设置dateModified。
然后使用:
UPDATE Customer
SET importantColumn=
,dateModified = @RunDate
WHERE ...
UPDATE CustomerPrice
SET importantColumn=
,dateModified = @RunDate
WHERE ...
答案 3 :(得分:0)
@astander是对的,如果你想要自动化,你应该使用更新触发器。我的更新触发器略有不同(我使用'inserted'虚拟表)。这是适合您的架构的一个(重命名,但你认为合适):</ p>
CREATE TRIGGER [CustomerDateModifiedTrigger] ON [dbo].[Customer]
FOR UPDATE
AS
UPDATE Customer
SET dateModified = GETDATE()
FROM Customer c
INNER JOIN inserted i ON c.customerID = i.customerID
答案 4 :(得分:0)
@Kronass,你不知道你在说什么!
timestamp是rowversion数据类型的同义词,受数据类型同义词行为的影响。在DDL语句中,尽可能使用rowversion而不是timestamp。有关更多信息,请参阅数据类型同义词(Transact-SQL)。
Transact-SQL时间戳数据类型与ISO标准中定义的时间戳数据类型不同。
不推荐使用时间戳语法。将在Microsoft SQL Server的未来版本中删除此功能。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
rowversion (Transact-SQL)是一种在数据库中公开自动生成的唯一二进制数的数据类型。 rowversion通常用作版本标记表行的机制。存储大小为8个字节。 rowversion数据类型只是一个递增的数字,不保留日期或时间。要记录日期或时间,请使用datetime2数据类型。
答案 5 :(得分:0)
1)确保为主键创建索引。 (我刚刚发现了这种类型的错误。)
2)您可以使用一个INSERT / UPDATE触发器而不是单独的触发器,但代价是效率很小。如果insert.DateCreated为null,则更新Vals.DateCreated,否则更新Vals.DateModified。
答案 6 :(得分:-2)
SQL Server Called时间戳中有一种数据类型。每次修改行时都会跟踪行版本。 或者,如果您需要,可以使用触发器并更改ModifiedDate列。