将TIMESTAMP列更新为可为空

时间:2014-07-15 20:20:31

标签: sql-server tsql sql-server-2012

我有一个存在于两个数据库中的表。

在一个数据库中,有一个表格,其中的ROW_VERSION列名为TIMESTAMP NOT NULL

在第二个数据库中,同一个表具有TIMESTAMP类型的相同列,但它的类型为TIMESTAMP NULL

我想将第一个数据库中的列更改为可为空。这将允许我更容易在两个数据库之间进行同步。

但是当我跑这个时:

ALTER TABLE [MyTable]
ALTER COLUMN ROW_VERSION TIMESTAMP NULL

我收到错误:

  

无法更改列' ROW_VERSION'是数据类型时间戳。

这已经是时间戳了。 我只需要让它可以为空。反正有没有这样做?

4 个答案:

答案 0 :(得分:3)

我认为你不能。一个表只能有一个时间戳列。

您也无法更新时间戳列,因此旧的“复制/删除/更新”技巧将无效。

你可能会被你所拥有的东西困住。

create table #tmp (id int, timestamp null)
insert into #tmp (id) values (1)
select * from #tmp


create table #tmp2 (id int)
insert into #tmp2 (id) values (1)
alter table #tmp2 add timestamp null
select * from #tmp2

我正在测试NULL TIMESTAMP列,它实际上不会变为NULL - 我找不到任何说明它的文档,但我认为不可能有一个NULL TIMESTAMP(即使声明为null,它永远不会为null)数据)。

  

timestamp是rowversion数据类型的同义词,也是主题   对数据类型同义词的行为。在DDL语句中,使用   尽可能使用rowversion代替时间戳。更多   信息,请参阅数据类型同义词(Transact-SQL)...

http://msdn.microsoft.com/en-us/library/ms182776(v=sql.110).aspx

也...

  

ALTER COLUMN指定要更改命名列或   改变。修改后的列不能是以下任何一种:A   具有时间戳数据类型的列...

http://msdn.microsoft.com/en-us/library/ms190273(v=sql.110).aspx

答案 1 :(得分:1)

您无法更改TIMESTAMP列(http://msdn.microsoft.com/en-us/library/ms190273.aspx) 您将不得不采用迂回方式重命名旧表,创建具有所需模式的新表,从重命名的表中插入数据,然后删除旧表。如果更改GUI中的列,SSMS可能会为您编写脚本。

  

ALTER COLUMN
  指定要更改或更改命名列。

     

修改后的列不能是以下任何一种:

     

•具有时间戳数据类型的列。

答案 2 :(得分:0)

是的,你不能这样做。几乎听起来你想要为该列使用日期或日期时间数据类型,如果你想让它可以为空。我认为TIMESTAMP类似于IDENTITY数据类型,因为它们都是自填充的,自动递增的列,这些列实际上没有意义为null。另请注意,如果您尝试以下操作:

if object_id('tempdb..#timestamptable') is not null 
    drop table #timestamptable
create table #timestamptable (id int, ts timestamp null)
insert into #timestamptable (id, ts)
values(1, null),
(2, null)
select *
from #timestamptable

您的时间戳列仍会包含数据:

    id      ts
    1       0x000000004C8BED2B
    2       0x000000004C8BED2C

答案 3 :(得分:-1)

强迫类型 ALTER TABLE [MyTable] ALTER COLUMN ROW_VERSION TIMESTAMP

删除索引(如果存在)

ALTER TABLE SOMETABLE DROP CONSTRAINT DF__SOME__index

可能添加DEFAULT VALUE

ALTER TABLE [MyTable]为ROW_VERSION添加默认值0

我将删除表并重新创建,如果允许它