命令中的 Postgres 语法错误与文档一致
Postgres syntax error in command consistent with documentation
我正在尝试向 postgres
版本 9.6.2 中的 table 添加一列。
$ psql --version
psql (PostgreSQL) 9.6.2
因此,我引用了 ALTER TABLE
documentation for postgres 9.6
。
文档说:
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
action [, ... ]
where action is one of:
ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
我有一个 table task
:
=> select * from task;
id | name
----+------
(0 rows)
我想使用幂等命令在其上插入列 state
(即检查是否已创建 state
列)。该命令是:
ALTER TABLE task ADD COLUMN IF NOT EXISTS state BIGINT NOT NULL;
但是,这会在 NOT
:
处出现语法错误
=> ALTER TABLE task ADD COLUMN IF NOT EXISTS state BIGINT NOT NULL;
ERROR: syntax error at or near "NOT"
LINE 1: ALTER TABLE task ADD COLUMN IF NOT EXISTS state BIGINT NOT N...
这个命令是不是和文档不一致?如何解决语法错误?
注意:当我删除 IF NOT EXISTS
短语时,该命令可以正常运行,但在这种情况下生成的命令不是所需的幂等。
您可以在 Postgres < 9.6 中编写一个存储函数,用于以故障安全方式添加列。这是一个非常简单的版本:
CREATE OR REPLACE FUNCTION add_column(in_statement TEXT, in_table TEXT, in_column TEXT, in_schema TEXT DEFAULT 'public') RETURNS BOOLEAN AS $_$
BEGIN
PERFORM * FROM information_schema.columns WHERE table_name = in_table AND column_name = in_column AND table_schema = in_schema;
IF FOUND THEN
RETURN FALSE;
ELSE
EXECUTE in_statement;
RETURN TRUE;
END IF;
END
$_$ LANGUAGE plpgsql VOLATILE;
您可以添加列;
SELECT add_column('ALTER TABLE task ADD COLUMN state BIGINT NOT NULL', 'task', 'state');
架构名称是可选的,只有在架构不是 public
时才需要指定。
我正在尝试向 postgres
版本 9.6.2 中的 table 添加一列。
$ psql --version
psql (PostgreSQL) 9.6.2
因此,我引用了 ALTER TABLE
documentation for postgres 9.6
。
文档说:
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] action [, ... ]
where action is one of:
ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
我有一个 table task
:
=> select * from task;
id | name
----+------
(0 rows)
我想使用幂等命令在其上插入列 state
(即检查是否已创建 state
列)。该命令是:
ALTER TABLE task ADD COLUMN IF NOT EXISTS state BIGINT NOT NULL;
但是,这会在 NOT
:
=> ALTER TABLE task ADD COLUMN IF NOT EXISTS state BIGINT NOT NULL;
ERROR: syntax error at or near "NOT"
LINE 1: ALTER TABLE task ADD COLUMN IF NOT EXISTS state BIGINT NOT N...
这个命令是不是和文档不一致?如何解决语法错误?
注意:当我删除 IF NOT EXISTS
短语时,该命令可以正常运行,但在这种情况下生成的命令不是所需的幂等。
您可以在 Postgres < 9.6 中编写一个存储函数,用于以故障安全方式添加列。这是一个非常简单的版本:
CREATE OR REPLACE FUNCTION add_column(in_statement TEXT, in_table TEXT, in_column TEXT, in_schema TEXT DEFAULT 'public') RETURNS BOOLEAN AS $_$
BEGIN
PERFORM * FROM information_schema.columns WHERE table_name = in_table AND column_name = in_column AND table_schema = in_schema;
IF FOUND THEN
RETURN FALSE;
ELSE
EXECUTE in_statement;
RETURN TRUE;
END IF;
END
$_$ LANGUAGE plpgsql VOLATILE;
您可以添加列;
SELECT add_column('ALTER TABLE task ADD COLUMN state BIGINT NOT NULL', 'task', 'state');
架构名称是可选的,只有在架构不是 public
时才需要指定。