SQL中的Alter table add column语法

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

谢谢


2
错误信息中有一个括号,而您发布的语法没有。您确定两者同步吗?您使用的是哪个关系型数据库管理系统?我相当确定您需要以某种方式(可能是引号)限定包含空格的列名。 - Martin Smith
4个回答

22

我刚在PostgreSQL中尝试了这个修复的语法,并且它起作用了。虽然没有short数据类型,但您可以使用其他东西(也许是smallint?)。如果您的表包含数据,则此脚本将因John's答案中提到的原因而失败。

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列(对于某些RDBMSs,即使表中没有数据,也无法添加NOT NULL列)。
要么提供默认值,要么允许该列为空。您始终可以使用数据填充新列,并在之后修改列为NOT NULL。

0
作为一个有同样问题的人,我不确定如何看待这些答案。我尝试了所有方法,但总是得到一个"near"某个术语或其他错误。回到官方文档后,我意识到缺少一个额外的关键字,比如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 的具体问题(特别是与日期相关的问题),我阅读了这个 答案,它似乎有效 - 我没有收到错误消息 -。
zuri=# update lili_code set sunsetdate=NULL; UPDATE 0

但是后来我读到了

成功完成后,UPDATE命令返回一个形式为的命令标记

UPDATE count

计数是更新的行数。如果计数为0,则没有行与条件匹配(这不被视为错误)。
这也在官方文档中这里
最后,我转向PGAdminIII,在那里我发现NOT NULL是一个简单的复选框。取消勾选它,问题解决了。我相信有一种方法可以在psql命令行上使其工作,只是我还没有找到它。
我认为某些变化也可能是由于ALTER和UPDATE之间的差异(请参见此SO 答案和我的俏皮评论),以及添加新结构(如OP的问题)和修改已经存在的数据之间的差异(如我的问题)。 故事的寓意是,阅读官方文档。不要只是浏览。阅读它。如果您想了解更多关于NULL和NOT NULL的信息,请阅读这个

0

抱歉打开这么老的问题,但其中一个答案中的建议让我付出了很多麻烦,他说您不能添加 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  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接