mar*_*osh 128 postgresql postgresql-9.1
问题很简单.如何将列添加x到表中y,但仅当x列不存在时?我在这里找到了解决方法,如何检查列是否存在.
SELECT column_name
FROM information_schema.columns
WHERE table_name='x' and column_name='y';
Run Code Online (Sandbox Code Playgroud)
a_h*_*ame 298
使用Postgres 9.6,可以使用该选项完成if not exists
ALTER TABLE table_name ADD COLUMN IF NOT EXISTS column_name INTEGER;
Run Code Online (Sandbox Code Playgroud)
Mat*_*ood 124
这是一个使用"DO"语句的简短版本:
DO $$
BEGIN
BEGIN
ALTER TABLE <table_name> ADD COLUMN <column_name> <column_type>;
EXCEPTION
WHEN duplicate_column THEN RAISE NOTICE 'column <column_name> already exists in <table_name>.';
END;
END;
$$
Run Code Online (Sandbox Code Playgroud)
您不能将这些作为参数传递,您需要在客户端的字符串中进行变量替换,但这是一个自包含的查询,只有在列已经存在时才会发出消息,如果不存在则添加将继续失败的其他错误(如无效的数据类型).
如果这些是来自外部源的随机字符串,我建议不要执行任何这些方法.无论您使用何种方法(作为查询执行的cleint端或服务器端动态字符串),它都会成为灾难的一种方法,因为它会打开您的SQL注入攻击.
Erw*_*ter 22
CREATE OR REPLACE function f_add_col(_tbl regclass, _col text, _type regtype)
RETURNS bool AS
$func$
BEGIN
IF EXISTS (SELECT 1 FROM pg_attribute
WHERE attrelid = _tbl
AND attname = _col
AND NOT attisdropped) THEN
RETURN FALSE;
ELSE
EXECUTE format('ALTER TABLE %s ADD COLUMN %I %s', _tbl, _col, _type);
RETURN TRUE;
END IF;
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
呼叫:
SELECT f_add_col('public.kat', 'pfad1', 'int');
Run Code Online (Sandbox Code Playgroud)
TRUE成功返回,否则FALSE(列已存在).
引发无效表或类型名称的异常.
这可以通过DO语句完成,但DO语句不能返回任何内容.如果是重复使用,我会创建一个函数.
我使用对象标识符类型 regclass和regtypefor _tbl,_type其中a)防止SQL注入和b)立即检查两者的有效性(最便宜的方式).列名_col仍然被用于消毒EXECUTE用quote_ident().在这个相关答案中有更多解释:
format()需要Postgres 9.1+.对于旧版本手动连接:
EXECUTE 'ALTER TABLE ' || _tbl || ' ADD COLUMN ' || quote_ident(_col) || ' ' || _type;
Run Code Online (Sandbox Code Playgroud)您可以对表名进行架构限定,但不必如此.
您可以在函数调用中双引号标识符以保留驼峰大小写和保留字(但您不应该使用任何此类标记).
我查询pg_catalog而不是information_schema.详细说明:
提示:包含
EXCEPTION子句的块进入和退出的成本明显高于没有子句的块.因此,请勿在不需要的情况下使用EXCEPTION.
Viv*_* S. 17
以下select查询将返回true/false,使用EXISTS()函数.
EXISTS():EXISTS
的参数是一个任意的SELECT语句或子查询.对子查询进行求值以确定它是否返回任何行.如果它至少返回一行,则EXISTS的结果为"true"; 如果子查询没有返回任何行,则EXISTS的结果为"false"
SELECT EXISTS(
SELECT column_name
FROM information_schema.columns
WHERE table_schema='public'
and table_name='x'
and column_name='y')
Run Code Online (Sandbox Code Playgroud)
并使用以下动态sql语句来更改表
DO
$$
BEGIN
IF not EXISTS (SELECT column_name
FROM information_schema.columns
WHERE table_schema='public' and table_name='x' and column_name='y') THEN
alter table x add column y int default null ;
else
raise NOTICE 'Already exists';
END IF;
END
$$
Run Code Online (Sandbox Code Playgroud)
小智 8
对于那些使用 Postgre 9.5+ 的人(我相信你们大多数人都这样做),有一个非常简单干净的解决方案
ALTER TABLE if exists <tablename> add if not exists <columnname> <columntype>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
104818 次 |
| 最近记录: |