8

我正在使用 SQL Server 和系统版本化(临时)表。在我的主表中,我有一INT列当前允许 NULL。我想将其更新为不允许空值,但表的系统/历史副本允许空值。

我运行这个语句:

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

我得到这个错误:

无法将值 NULL 插入列“MyInt”、表“mydb.dbo.MyTable_History”;列不允许空值。更新失败。

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

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

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

4

3 回答 3

9

我也看过这个,看来您必须将系统版本列中的 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
于 2020-03-13T17:35:18.443 回答
1

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

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;
于 2021-07-29T16:33:28.267 回答
0

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

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

于 2020-02-03T11:00:53.097 回答