【问题标题】:Altering a column to be nullable将列更改为可为空
【发布时间】:2011-04-03 04:22:27
【问题描述】:

我想将表列更改为可为空。我用过:

ALTER TABLE Merchant_Pending_Functions Modify NumberOfLocations NULL

这会在Modify 出现错误。正确的语法是什么?

【问题讨论】:

  • 请在以后发布错误信息
  • 我已经删除了 SQL Server 标记,因为它看起来已经成为所有人的通用免费。

标签: sql


【解决方案1】:

确保添加要修改的列的 data_type。

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME DATA_TYPE NULL;

【讨论】:

  • 请为您的答案添加代码类型符号并对此进行一些描述
【解决方案2】:

SQLite

ALTER TABLE 命令有点特殊。无法修改列。您必须创建一个新列,迁移数据,然后删除该列:

-- 1. First rename
ALTER TABLE
    Merchant_Pending_Functions
RENAME COLUMN
    NumberOfLocations
TO
   NumberOfLocations_old

-- 2. Create new column
ALTER TABLE
    Merchant_Pending_Functions
ADD COLUMN
    NumberOfLocations INT NULL

-- 3. Migrate data - you need to write code for that
-- 4. Drop the old column
ALTER TABLE
    Merchant_Pending_Functions
DROP COLUMN
    NumberOfLocations_old

【讨论】:

    【解决方案3】:

    甲骨文

    ALTER TABLE Merchant_Pending_Functions MODIFY([column] NOT NULL);

    【讨论】:

    • 这个答案对@IgorS 的answer 有什么新的意义吗? SQL_SCRIPT 代表什么?
    【解决方案4】:

    这取决于您使用的 SQL 引擎,在 Sybase 中您的命令可以正常工作:

    ALTER TABLE Merchant_Pending_Functions 
    Modify NumberOfLocations NULL;
    

    【讨论】:

      【解决方案5】:
      ALTER TABLE Merchant_Pending_Functions MODIFY COLUMN `NumberOfLocations` INT null;
      

      这对你有用。

      如果您想将一个非空列更改为允许为空,则无需包含非空子句。因为默认列不为空。

      ALTER TABLE Merchant_Pending_Functions MODIFY COLUMN `NumberOfLocations` INT;
      

      【讨论】:

        【解决方案6】:

        对于 HSQLDB:

        ALTER TABLE tableName ALTER COLUMN columnName SET NULL;
        

        【讨论】:

          【解决方案7】:

          在 PostgresQL 中是:

          ALTER TABLE tableName ALTER COLUMN columnName DROP NOT NULL;
          

          【讨论】:

            【解决方案8】:

            如果这是 MySQL 语法,则该类型将丢失,正如其他一些响应所指出的那样。 正确的 MySQL 语法应该是:

            ALTER TABLE Merchant_Pending_Functions MODIFY NumberOfLocations INT NULL
            

            为了方便 MySQL 用户在此处发布。

            【讨论】:

              【解决方案9】:

              对于 Oracle 数据库 10g 用户:

              alter table mytable modify(mycolumn null);
              

              当你尝试其他方式时,你会得到“ORA-01735: invalid ALTER TABLE option”

              ALTER TABLE mytable ALTER COLUMN mycolumn DROP NOT NULL;
              

              【讨论】:

              • 酷,您不必指定数据类型,只需“null”即可使其可为空。
              【解决方案10】:

              正如其他人所观察到的,该命令的精确语法因 DBMS 的不同风格而异。您使用的语法适用于 Oracle:

              SQL> desc MACAddresses
               Name                                      Null?    Type
               ----------------------------------------- -------- ----------------------------
               COMPUTER                                           NUMBER
               MACADDRESS                                         VARCHAR2(12)
               CORRECTED_MACADDRESS                      NOT NULL VARCHAR2(17)
              
              SQL> alter table MACAddresses
                2       modify corrected_MACAddress null
                3  /
              
              Table altered.
              
              SQL> desc MACAddresses
               Name                                      Null?    Type
               ----------------------------------------- -------- ----------------------------
               COMPUTER                                           NUMBER
               MACADDRESS                                         VARCHAR2(12)
               CORRECTED_MACADDRESS                               VARCHAR2(17)
              
              SQL>
              

              【讨论】:

                【解决方案11】:

                虽然我不知道您使用的是什么 RDBMS,但您可能需要提供整个列规范,而不仅仅是说您现在希望它可以为空。例如,如果当前为INT NOT NULL,则应发出ALTER TABLE Merchant_Pending_Functions Modify NumberOfLocations INT

                【讨论】:

                • 这是一个正确且描述性的答案,因此请澄清Null | NOT NULL 未指定,该列将为空。
                【解决方案12】:

                假设SQL Server(基于您之前的问题):

                ALTER TABLE Merchant_Pending_Functions ALTER COLUMN NumberOfLocations INT NULL
                

                INT 替换为您的实际数据类型。

                【讨论】:

                • 尝试使用 SSMS 中的表“设计”实用程序将位列从 NOT NULL 更改为 NULL。我收到一个错误,表明需要删除并重新创建表。哇!这种 ALTER TABLE 语法有效,并且比删除并重新创建表以使单个列可以为空要容易得多。
                猜你喜欢
                • 2013-09-10
                • 2011-12-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-04-03
                • 1970-01-01
                • 2011-08-23
                • 1970-01-01
                相关资源
                最近更新 更多