更改表在SQL中添加列语法

时间:2010-08-10 11:20:18

标签: sql postgresql

我正在尝试更改名为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

由于

4 个答案:

答案 0 :(得分:21)

我刚刚在postgressql中尝试了这个固定语法,但它确实有效。虽然没有short数据类型,所以你必须使用别的东西(也许是smallint?)如果你的表包含数据,那么这个脚本会因John的答案中的原因而失败。

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

答案 1 :(得分:3)

此外,如果您的表中包含数据,则无法添加NOT NULL列(对于某些RDBMS,即使表中没有数据,也无法添加NOT NULL列)。

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

答案 2 :(得分:0)

很抱歉打开这么老的问题,但是其中一个你无法添加NOT NULL的答案中的建议给我带来了很多麻烦。您 CAN 将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  

答案 3 :(得分:0)

作为一个带着同样问题来到这里的人,我不知道如何解释这些问题。我尝试了所有这些,并且总是在一个或另一个术语中“接近”语法错误。回到官方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和我的厚颜无耻的评论)以及ADDing新结构(如OP的问题中)和修改之间的差异已存在的数据(如我的)。 故事的寓意,阅读官方文档。不要扫描它。阅读。如果您想了解有关NULL和NOT NULL的更多信息,请阅读this