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