【发布时间】:2021-08-28 18:09:01
【问题描述】:
我正在审查一个项目的内容,并在 SQL Server 中注意到,修改列的数据类型删除了现有的非空检查。我想将其与 Oracle 进行比较,并注意到发生数据类型更改时不会删除 null 检查。
我的问题:SQL Server 在没有明确指定 alter 语句以使列不为空的情况下不保留空检查是否有原因?谷歌搜索后,无法真正找到答案。也许这是特定于 SQL Server 中关闭的设置? 如果没有配置,似乎有一个很好的理由,我看不出为什么会发生这种情况。
这是我用来比较的 SQL:
-- SQL Server
CREATE TABLE TestTable (Name varchar(50) NOT NULL);
-- Does not allow null
SELECT COLUMNPROPERTY(OBJECT_ID('dbo.TestTable', 'U'), 'Name', 'AllowsNull');
ALTER TABLE TestTable ALTER COLUMN Name varchar(250);
-- Allows null now
SELECT COLUMNPROPERTY(OBJECT_ID('dbo.TestTable', 'U'), 'Name', 'AllowsNull');
DROP TABLE TestTable;
-- Oracle
CREATE TABLE MYSCHEMA.TestTable (Name VARCHAR2(50) NOT NULL);
select nullable from all_tab_columns where owner = 'MYSCHEMA' and table_name = 'TESTTABLE' and column_name = 'NAME';
ALTER TABLE MYSCHEMA.TestTable MODIFY Name VARCHAR2(250);
select nullable from all_tab_columns where owner = 'MYSCHEMA' and table_name = 'TESTTABLE' and column_name = 'NAME';
Drop Table MYSCHEMA.TestTable;
环境:
- SQL Server 2017
- 甲骨文 12c
两者都在 linux 上的 docker 中运行。
【问题讨论】:
-
此时我想只是向后兼容。这是 ALTER TABLE ... ALTER COLUMN 的一个恼人的怪癖,如果未指定(独立于 ANSI_NULL_DFLT_ON 设置),它总是将其设置为 NULL,但可能有依赖它的脚本。最好是明确的以避免意外
标签: sql sql-server oracle