将系统版本化列可为空的列更改为非空

Alter Column to Not Null where System Versioned column was nullable

我正在使用 SQL 服务器和系统版本控制(临时)table。在我的主 table 中,我有一个当前允许 NULL 的 INT 列。我想将其更新为不允许空值,但是 table 的 system/history 副本允许空值。

我运行这个声明:

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

我得到这个错误:

Cannot insert the value NULL into column 'MyInt', table 'mydb.dbo.MyTable_History'; column does not allow nulls. UPDATE fails.

我使用这个脚本创建了版本 table 的系统:

ALTER TABLE dbo.MyTable
    ADD 
        ValidFrom DATETIME2 (2) GENERATED ALWAYS AS ROW START HIDDEN CONSTRAINT DFMyTable_ValidFrom DEFAULT DATEADD(SECOND, -1, SYSUTCDATETIME()),
        ValidTo DATETIME2 (2) GENERATED ALWAYS AS ROW END HIDDEN CONSTRAINT DFMyTable_ValidTo DEFAULT '9999.12.31 23:59:59.99',
        PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);

ALTER TABLE dbo.MyTable 
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.MyTable_History));
GO

在这种情况下,是否有其他方法可以让我的主要 table 列不可为空?我想我可以(也许)用任意垃圾值手动更新现有的系统版本空值,但似乎这种情况应该由时间 tables.

支持

您无法在系统版本控制的 table 上更新行或更改列。

您可以在关闭系统版本控制的情况下对两个 table 进行更改,然后再次打开它,或者创建一个新的系统版本控制 table 并复制数据。

我也看了这个,看来你必须将系统版本列中的 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

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

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;