我有一个存在于两个数据库中的表。
在一个数据库中,有一个表格,其中的ROW_VERSION
列名为TIMESTAMP NOT NULL
。
在第二个数据库中,同一个表具有TIMESTAMP
类型的相同列,但它的类型为TIMESTAMP NULL
。
我想将第一个数据库中的列更改为可为空。这将允许我更容易在两个数据库之间进行同步。
但是当我跑这个时:
ALTER TABLE [MyTable]
ALTER COLUMN ROW_VERSION TIMESTAMP NULL
我收到错误:
无法更改列' ROW_VERSION'是数据类型时间戳。
这已经是时间戳了。 我只需要让它可以为空。反正有没有这样做?
答案 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)
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
我将删除表并重新创建,如果允许它