为什么在列上运行ALTER TABLE会使它从NOT NULL变为NULL?


8

我正在大规模更新SQL Server数据库。我将所有numeric(38,0)列更改为int (是的,SQL Server脚本是从Oracle脚本创建的)。使用SMO和C#(我是一名软件工程师),我设法生成了非常不错的脚本,如SQL Server Management Studio。除了一个特定的问题,所有这些工作都非常好:

对于少数几个表,当我调用ALTER TABLE [myTable] ALTER COLUMN [columnA] INT它时,它决定还更改的列NOT NULL to NULL。这当然是一个巨大的问题,因为我需要为那些特定列上的大多数表重新生成主键。

显然,我在使用SMO时有很多选择,可以找出哪些列是主键,并在更新数据类型后或更新时将它们强制为NOT NULL,但我真的很好奇这可能是什么原因。


您也可以通过T / SQL查找列是否是主键的成员。不需要SMO。
mrdenny

Answers:


10

这取决于您对SET ANSI_NULL_DFLT_OFFSET ANSI_NULL_DFLT_ON的设置(也可以从SET ANSI_DEFAULTS读取这些以获取其他效果)。

就个人而言,如果我想要空列或非空列,而不是依赖环境设置,我会明确指定此约束。

ALTER TABLE [myTable] ALTER COLUMN [columnA] INT NOT NULL

您可以再次发出此命令,并且如果某列已经具有所需的可空性,则该命令将被忽略。

但是,您还说过,只需要在它是主键的一部分的地方进行更改即可。从建模/实现阶段开始,这应该与列是否可以为空无关


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.