【问题标题】:Alter table add column syntax in SQL在 SQL 中更改表添加列语法
【发布时间】:2010-08-10 11:20:17
【问题描述】:

我正在尝试更改名为 company 的表,但它会显示错误

syntax error at or near "("
LINE 2: ADD( company_access_level short NOT NULL,

我的语法是

ALTER TABLE company
ADD company_access_level short NOT NULL,
workgroup_level short NOT NULL,
Company Logon URL character varying NOT NULL,
Company Logoff URL character varying NOT NULL

谢谢

【问题讨论】:

  • 错误消息中有一个括号,而您发布的语法没有。你确定这两个是同步的?您使用的是什么 RDBMS?我很确定您需要以某种方式(可能在引号中)分隔包含空格的列名

标签: sql postgresql


【解决方案1】:

我刚刚在 postgressql 中尝试了这个固定的语法,它成功了。虽然没有short 数据类型,但您必须使用其他类型(可能是smallint?)如果您的表包含数据,则此脚本将因约翰回答中的原因而失败。

ALTER TABLE company
ADD company_access_level int NOT NULL,
ADD workgroup_level int NOT NULL,
ADD "Company Logon URL" character varying NOT NULL,
ADD "Company Logoff URL" character varying NOT NULL

【讨论】:

    【解决方案2】:

    另外,如果您的表中有数据,那么您不能添加 NOT NULL 列(对于某些 RDBMS,即使表中没有数据,您也不能添加 NOT NULL 列)。

    要么提供默认值,要么允许列为 NULLable。您始终可以使用数据填充新列,然后将列修改为 NOT NULL。

    【讨论】:

      【解决方案3】:

      很抱歉打开这样一个老问题,但是其中一个答案中的建议是您无法添加 NOT NULL,这给我带来了很多麻烦。您可以将 NOT NULL 列添加到包含数据的表中,唯一的限制是您还必须提供默认值。用 Sybase、Postgres 和 MySQL 测试。所以上面的例子就变成了:

      ALTER TABLE company
       ADD company_access_level int default 'not set' NOT NULL ,
       ADD workgroup_level int default 0 NOT NULL,
       ADD "Company Logon URL" character varying default 'not set' NOT NULL,
       ADD "Company Logoff URL" character varying default 'not set' NOT NULL  
      

      【讨论】:

        【解决方案4】:

        作为一个带着同样问题来到这里的人,我不知道如何理解这些答案。我尝试了所有这些,并且总是在一个或另一个术语“附近”出现语法错误。回到官方docs后,才发现少了一个额外的关键字,比如SET或者TYPE。例子:

        先这个

        zuri=# ALTER TABLE newarts ALTER COLUMN sunsetdate DATE NULL; ERROR: syntax error at or near "DATE" LINE 2: ALTER COLUMN sunsetdate DATE NULL;

        然后这个:

        zuri=# ALTER TABLE newarts ALTER COLUMN sunsetdate TYPE DATE NULL; ERROR: syntax error at or near "NULL" LINE 2: ALTER COLUMN sunsetdate TYPE DATE NULL;

        是的,那里仍然有一个错误,但是一旦我用关键字 TYPE 指定了 DATE 的含义,错误就解决了,我转到另一个错误。我对添加 SET 有相同的体验(请参阅我已经引用的官方文档同一页面上的示例)。

        至于 NOT NULL 的具体问题,(尤其是与我的日期问题有关)我阅读了这个answer 并且它似乎有效 - 我没有收到错误消息 -

        zuri=# update lili_code set sunsetdate=NULL; UPDATE 0
        

        但后来我读了

        成功完成后,UPDATE 命令返回格式为命令标记

        UPDATE count
        

        计数是更新的行数。如果 count 为 0,则没有行 符合条件(这不被视为错误)。

        这也在官方文档中,here

        最后,我转向 PGAdminIII,在那里我发现 NOT NULL 是一个简单的复选框。取消勾选,问题解决。我确信有一种方法可以使用 psql 在命令行中完成这项工作,但我还没有找到。

        我认为一些变化也可能是由于 ALTER 和 UPDATE 之间的差异(参见这个 SO answer 和我厚颜无耻的评论)以及添加新结构(如 OP 的问题)和修改数据之间的差异已经在那里(就像我的一样)。 故事的寓意,阅读官方文档。不要扫描它。阅读。如果您想了解更多关于 NULL 和 NOT NULL 的信息,请阅读this

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-06
          • 1970-01-01
          • 1970-01-01
          • 2017-01-07
          • 1970-01-01
          相关资源
          最近更新 更多