我需要一个时间戳字段,每次用户修改记录时都会更新。
到目前为止,我使用了MySql,我甚至可以在字段创建中使用它:
Alter table myTable add `last_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP **ON UPDATE CURRENT_TIMESTAMP**
我在Sql Server中找不到这种可能性。
然后我尝试写一个触发器。
在MySql触发器中,这很简单:
Set new.last_time=CURRENT_TIMESTAMP();
Sql Server似乎既不知道新语法,也不知道旧语法,它给我编译错误。
的
update myTable set last_time =CURRENT_TIMESTAMP;
工作,但它更新了所有行而不是当前行。
有没有办法告诉Sql Server更新当前记录?我是否应该更新myid = something" ?
SQL Server是否知道它正在处理的实际记录是什么?
答案 0 :(得分:10)
如果你真的需要一个时间戳 - 然后在插入和更新时触发,用当前时间映射更新列。
CREATE TRIGGER dbo.trgAfterUpdate ON dbo.YourTable
AFTER INSERT, UPDATE
AS
UPDATE dbo.YourTable
SET last_changed = GETDATE()
FROM Inserted i
要更新单行(已编辑或插入),您应该使用
CREATE TRIGGER dbo.trgAfterUpdate ON dbo.YourTable
AFTER INSERT, UPDATE
AS
UPDATE f set LastUpdate=GETDATE()
FROM
dbo.[YourTable] AS f
INNER JOIN inserted
AS i
ON f.rowID = i.rowID;
这些应该是你所需要的。 GETUTCDATE()如果你想要它在UTC(我更喜欢)
SQL Server绝对知道它处理的行,只是你有严重的SQL基础问题。
更新myTable设置last_time = CURRENT_TIMESTAMP;工作,但它 更新了所有行而不是当前行。
是的,猜猜是什么 - 因为这正是你告诉SQL Server的:更新表中的所有行。
Sql Server不知道它正在处理哪个实际记录吗?
集合没有当前行;)这就是问题开始的地方。
完全按照自己的意愿完成这个任务的唯一方法是在我的答案开头:时间戳。但是,由于误解,我添加了一个建议:获取一本关于SQL基础知识的书。
答案 1 :(得分:-2)
使用rowversion数据类型。 Rowversion通常用作在MS-SQL服务器中对表行进行版本标记的机制。 rowversion数据类型只是一个递增的数字,不保留日期或时间。要记录日期或时间,请使用datetime2数据类型。 有关更多信息,请参阅msdn(http://technet.microsoft.com/en-us/library/ms182776.aspx)
中的rowversion