空数组作为PostgreSQL数组列的默认值

Het*_*ett 37 sql postgresql

我在postgresql 9.4数据库中定义了一个数组字段:

character varying(64)[]
Run Code Online (Sandbox Code Playgroud)

我可以为该字段的默认值设置一个空数组,例如{}吗?设置的语法是什么?

如果只设置括号{},我会收到以下错误:

SQL error:

ERROR:  syntax error at or near "{"
LINE 1: ...public"."accounts" ALTER COLUMN "pwd_history" SET DEFAULT {}
                                                                     ^

In statement:
ALTER TABLE "public"."accounts" ALTER COLUMN "pwd_history" SET DEFAULT {}
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 49

您需要使用显式array初始化程序并将其强制转换为正确的类型:

ALTER TABLE public.accounts 
    ALTER COLUMN pwd_history SET DEFAULT array[]::varchar[];
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你!我也找到了另一个解决方案,虽然不知道哪一个更"正确"`pwd_history SET DEFAULT'{}'`.但据我所知,这两个解决方案都为postgresql(显式/隐式)产生了相同的转换. (8认同)
  • 正如任何人试图通过SqlAlchemy(对于python)创建默认值一样:你必须在ORM映射中使用`{}`作为默认值,例如`sizes = Column(postgresql.ARRAY(postgresql.TEXT), server_default ="{}")`并让它进行隐式转换,如上面@Hett注释中所述 (6认同)
  • 我意识到操作员专门询问了有关 Pg 9.4 的问题,但这对于较新版本的用户可能有用。只需将默认值设置为以下常量:“{}”。这将是 DDL:`my_array_column text[] DEFAULT '{}'::text[]` (3认同)

Bur*_*rak 6

它在找不到的地方抛出错误SET。这对我有用。

ALTER TABLE public.accounts 
    ALTER COLUMN pwd_history DEFAULT array[]::varchar[];
Run Code Online (Sandbox Code Playgroud)


Gol*_*Jer 5

我测试了接受的答案和评论中的答案。他们俩都工作。
我将对答案的注释进行分级,因为这是我的首选语法。

ALTER TABLE public.accounts 
    ALTER COLUMN pwd_history SET DEFAULT '{}';
Run Code Online (Sandbox Code Playgroud)