关于DateCreated和DateModified列的问题 - SQL Server

时间:2010-04-09 19:39:45

标签: sql-server database tsql default

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会在记录字段中发生更改/修改时不断更改。

换句话说,你能写一个快速触发样本吗?我还不太了解......

7 个答案:

答案 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列。