【问题标题】:SQL Server : removes null constraint when changing the column's datatype, Oracle does notSQL Server:更改列的数据类型时删除空约束,Oracle 不会
【发布时间】: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


【解决方案1】:

NULL 可能是默认值。

来自https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql?view=sql-server-ver15

当您使用 CREATE TABLE 或 ALTER TABLE 创建或更改表时 语句、数据库和会话设置影响并且可能 覆盖列中使用的数据类型的可空性 定义。确保始终将列显式定义为 NULL 或 NOT NULL 表示非计算列。

你试过了吗?

ALTER TABLE TestTable ALTER COLUMN Name varchar(250) NOT NULL;

【讨论】:

  • 我认为这是在 sql server 中进行架构更改时最终需要的。在询问了比我更了解数据库的人之后,我认为 sql server 将 not null 视为一种类型,而 oracle 将其视为一种约束。这就是为什么两人在这个话题上表现不同的原因。所以是的,确保设置了默认值,或者你在编写 SQL 时牢记框架,应该能让你到达那里!
  • NOT NULL 不是数据类型。我不喜欢依赖默认值。在这种情况下,文档明确说明不要这样做。
  • 道歉,说错了,不是指数据类型,而是对象类型,而 oracle 将其视为约束。我同意不依赖默认值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
相关资源
最近更新 更多