相关疑难解决方法(0)

使用默认关键字插入多行时,PostgreSQL 10 标识列获得“空值”

我最近从 PostgreSQL 9.5 升级到 PostgreSQL 10。PostgreSQL 10 中的一个漂亮特性是新的标识列类型,它是 PostgreSQL串行伪类型的替代品。身份栏的官方文档可以在CREATE TABLE一页中找到。

但是,当将多行插入到带有GENERATED BY DEFAULT AS IDENTITY列的表中使用关键字DEFAULT获取下一个 ID 值时,默认值返回为null.

例如,假设我有一张桌子

CREATE TABLE test (
  id int GENERATED BY DEFAULT AS IDENTITY,
  t text
);
CREATE TABLE
Run Code Online (Sandbox Code Playgroud)

使用DEFAULT关键字插入单行似乎工作正常。

INSERT INTO test (id, t) VALUES (DEFAULT, 'a');
INSERT 0 1
Run Code Online (Sandbox Code Playgroud)

插入多行不会。

INSERT INTO test (id, t) VALUES (DEFAULT, 'b'), (DEFAULT, 'c');
ERROR:  null value in column "id" violates …
Run Code Online (Sandbox Code Playgroud)

postgresql identity postgresql-10

7
推荐指数
1
解决办法
1987
查看次数

将虚拟数据插入到具有主键整数字段 GENERATED ALWAYS AS IDENTITY 的空表中

我正在尝试使用虚拟数据生成虚拟表,以测试某些 SQL 任务的性能。

基于这个旧线程:有没有办法将多行插入到所有列都有默认值的表中?

我注意到,对于类型IDENTITY,不再可能使用建议的generate_series(1, N)解决方案用虚拟数据填充表。

那么,如何将 1'000 个虚拟数据插入到下表 (PG 14) 中,从而利用字段的默认值name而不覆盖字段的系统值id

CREATE TABLE foo (
    id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
    name TEXT DEFAULT md5(random()::text)
);
Run Code Online (Sandbox Code Playgroud)

尝试以下操作失败:

INSERT INTO foo (id) 
  SELECT generate_series(1, 1000);

-- which results in:
ERROR:  cannot insert a non-DEFAULT value into column "id"
DETAIL:  Column "id" is an identity column defined as GENERATED ALWAYS.
HINT:  Use OVERRIDING SYSTEM VALUE to override.
SQL state: 428C9 …
Run Code Online (Sandbox Code Playgroud)

postgresql default-value

3
推荐指数
1
解决办法
4450
查看次数