2010-08-10 51 views
6

我试图改变公司表命名,但它会显示错误修改表添加列语法SQL

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 

感谢

+2

错误消息中有一个括号,并且您发布的语法没有。你确定两人同步?你使用的是什么RDBMS?我敢肯定,你需要以某种方式分隔包含空格的列名(可能用引号括起来) – 2010-08-10 11:23:05

+0

使用postgresql – lakshmi 2010-08-10 11:25:05

回答

20

我只是在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 
3

而且,如果表中有数据,则不能添加NOT NULL列(对于某些RDBMS,即使表中没有数据,也不能添加NOT NULL列)。

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

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 
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;

是的,还有一个错误出现,但一旦我指定日期的含义与关键字类型的错误已解决,我转移到另一个。我在添加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