【问题标题】:Modify table: How to change 'Allow Nulls' attribute from not null to allow null修改表:如何将“允许 Nulls”属性从非空更改为允许空
【发布时间】:2011-04-22 20:09:39
【问题描述】:

如何使用 T-SQL 更改表中的一个属性以允许空值(非空 --> 空)?可以更改表吗?

【问题讨论】:

  • SQL Server Management Studio 为这样一个简单的任务创建了一个非常复杂的脚本。这就是为什么我感到困惑并检查了stackoverflow。也许这就是问题的重点......

标签: sql sql-server sql-server-2008


【解决方案1】:

ALTER TABLE 是对的:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL

【讨论】:

  • 您确定需要重新定义约束,而只是重新定义数据类型? The MSDN article 没有提到需要重新定义约束:“如果使用 ALTER COLUMN 指定了 NULL 或 NOT NULL,则还必须指定 new_data_type [(precision [, scale ])]。如果数据类型、精度和比例未更改,请指定当前列值。"
  • @Daniel Vassallo - 你是对的。我试图完整,但更改 NULL/NOT NULL 应该是唯一的更改。
【解决方案2】:

是的,您可以使用ALTER TABLE,如下所示:

ALTER TABLE [table name] ALTER COLUMN [column name] [data type] NULL

引用ALTER TABLE 文档:

NULL 可以在ALTER COLUMN 中指定,以强制NOT NULL 列允许空值,PRIMARY KEY 约束中的列除外。

【讨论】:

    【解决方案3】:
    -- replace NVARCHAR(42) with the actual type of your column
    ALTER TABLE your_table
    ALTER COLUMN your_column NVARCHAR(42) NULL
    

    【讨论】:

    • 或者只是ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42),因为如果没有明确指定,它将默认允许空值。
    • 请注意,如果需要更改多个列以允许为空,则需要执行单独的ALTER TABLE .. ALTER COLUMN .. 命令
    • 请注意,在某些情况下这可能不起作用 - 如果您收到 ALTER TABLE ALTER COLUMN failed because one or more objects access this column.,请参阅 this DBA Stack Exchange answer
    【解决方案4】:
    ALTER TABLE public.contract_termination_requests
    ALTER COLUMN management_company_id DROP NOT NULL;
    

    【讨论】:

    • @ÁronLőrincz 问题与 Postgres 无关。它被标记为 SQL Server,因此此答案不正确。
    • 你是对的,但它仍然对我有帮助,我认为这对于通过谷歌找到问题的人来说是一个有用的评论。问题的标题没有明确说明它是关于哪个数据库服务器。
    【解决方案5】:

    对于 MySQL,MariaDB

    ALTER TABLE [table name] MODIFY COLUMN [column name] [data type] NULL
    

    使用MODIFY COLUMN 而不是ALTER COLUMN

    【讨论】:

      【解决方案6】:

      我写了这个,所以我可以一次将所有表和列编辑为空:

      select 
      case
      when sc.max_length = '-1' and st.name in ('char','decimal','nvarchar','varchar')
      then
      'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(MAX) NULL'
      when st.name in ('char','decimal','nvarchar','varchar')
      then
      'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(' + cast(sc.max_length as varchar(4)) + ') NULL'
      else
      'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + ' NULL'
      end as query
      from sys.columns sc
      inner join sys.types st on st.system_type_id = sc.system_type_id
      inner join sys.objects so on so.object_id = sc.object_id
      where so.type = 'U'
      and st.name <> 'timestamp'
      order by st.name
      

      【讨论】:

        【解决方案7】:

        这是执行此操作的方法:-

        1. 检查表或列是否存在。
        2. 如果是,则更改列。例如:-
        IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE 
                    TABLE_CATALOG = 'DBName' AND 
                    TABLE_SCHEMA = 'SchemaName' AND
                    TABLE_NAME = 'TableName' AND
                    COLUMN_NAME = 'ColumnName')
        BEGIN
            ALTER TABLE DBName.SchemaName.TableName ALTER COLUMN ColumnName [data type] NULL
        END  
        

        如果您没有任何架构,则删除架构行,因为您不需要提供默认架构。

        【讨论】:

          【解决方案8】:

          所以最简单的方法是,

          alter table table_name change column_name column_name int(11) NULL;
          

          【讨论】:

            猜你喜欢
            • 2013-08-06
            • 1970-01-01
            • 2019-09-22
            • 2011-12-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-08
            • 1970-01-01
            相关资源
            最近更新 更多