将“系统版本化”列可为空的“将列更改为不为空”

时间:2018-07-31 12:01:59

标签: sql-server temporal-tables

我正在使用SQL Server和系统版本的(临时)表。在主表中,我有一个 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> 列,该列当前允许NULL。我想更新它以不允许为空,但是表的系统/历史记录副本允许为空。

我运行以下语句:

INT

我收到此错误:

  

无法将值NULL插入表“ mydb.dbo.MyTable_History”的“ MyInt”列中;列不允许为空。 UPDATE失败。

我使用以下脚本创建了系统版本表:

ALTER TABLE dbo.MyTable 
    ALTER COLUMN MyInt INT NOT NULL;

在这种情况下,还有其他方法可以使主表的列不可为空吗?我想我可以(也许)用一个任意的垃圾值手动更新现有的系统版本的空值,但是似乎这种情况应该由临时表支持。

3 个答案:

答案 0 :(得分:3)

我也研究了这一点,看来您必须将系统版本列中的NULL值更新为某个值。

ALTER TABLE dbo.MyTable
    SET (SYSTEM_VERSIONING = OFF)
GO
UPDATE dbo.MyTable_History
    SET MyInt = 0 WHERE MyInt IS NULL --Update to default value
UPDATE dbo.MyTable
    SET MyInt = 0 WHERE MyInt IS NULL --Update to default value
ALTER TABLE dbo.MyTable
    ALTER COLUMN MyInt INT NOT NULL
ALTER TABLE dbo.MyTable_History
    ALTER COLUMN MyInt INT NOT NULL
GO
ALTER TABLE dbo.MyTable 
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.MyTable_History));
GO

答案 1 :(得分:0)

您不能在系统版本版本的表上更新行或更改列。

您可以在关闭系统版本控制之前对两个表进行更改,然后再次将其打开,或者创建新的系统版本控制表并在数据之间进行复制。

答案 2 :(得分:0)

我在尝试添加新的非空列时遇到了这个问题。我最初试图将列创建为可为空,更新所有值,然后将其设置为不可为空:

ALTER TABLE dbo.MyTable 
    ADD COLUMN MyInt INT NULL;

GO

UPDATE dbo.MyTable
    SET MyInt = 0;

GO

ALTER TABLE dbo.MyTable 
    ALTER COLUMN MyInt INT NOT NULL;

但我设法通过使用临时默认约束来解决它:

ALTER TABLE dbo.MyTable 
    ADD COLUMN MyInt INT NOT NULL CONSTRAINT DF_MyTable_MyInt DEFAULT 0;

ALTER TABLE dbo.MyTable
    DROP CONSTRAINT DF_MyTable_MyInt;