【问题标题】:How to insert value to identity column in PostgreSQL 11.1如何在 PostgreSQL 11.1 中向标识列插入值
【发布时间】:2019-09-06 03:14:16
【问题描述】:

我想将自己的值插入标识列。

表架构:

CREATE TABLE public.userdetail (
    userdetailid int4 NOT NULL GENERATED ALWAYS AS IDENTITY,
    username varchar(30) NOT NULL,
    "password" varchar(1000) NOT NULL,
    CONSTRAINT pk_userdetail PRIMARY KEY (userdetailid)
);

插入查询:

INSERT INTO UserDetail (UserDetailId,UserName, Password) 
  VALUES(1,'admin', 'password');

此处插入查询抛出以下错误:

无法插入“userdetailid”列

是否存在强制插入标识列的命令,如 MS SQL:

 SET IDENTITY_INSERT UserDetail ON

如果您有任何解决方案,请告诉我。

【问题讨论】:

  • 不要在values()into.. 中指定UserDetailId。它将被自动插入,这就是标识列的含义。

标签: database postgresql


【解决方案1】:

GENERATED ALWAYS 告诉 Postgres 始终为标识列生成值。如果您尝试在此类列中插入值,Postgres 将抛出错误。

如果要插入,可以使用以下查询

INSERT INTO UserDetail (UserName, Password) 
  VALUES('admin', 'password');

如果你真的想插入标识列,你可以使用GENERATED BY DEFAULT而不是GENERATED ALWAYS。在这种情况下,如果您没有为标识列提供值,Postgres 将使用生成的值。

或者

您可以使用OVERRIDING SYSTEM VALUE,如下所示

INSERT INTO UserDetail (UserDetailId,UserName, Password) 
OVERRIDING SYSTEM VALUE 
  VALUES(1,'admin', 'password');

【讨论】:

  • 是否存在强制插入标识列的命令,如 MS SQL :- SET IDENTITY_INSERT UserDetail ON;
  • @NayanRudani - 请检查修改后的答案
  • @FathahRehmanP 如果UserDetailId = 1 已经存在于表中怎么办。
  • @Rajnishkumar 如果UserDetailIdPRIMARY KEY,那么数据库将拒绝任何复制值的尝试。如果您尝试恢复丢失的数据,通常只会写入标识列。
  • 请注意,将显式值插入自动递增的字段不会更新 Postgres 用于为该字段生成新值的序列,如果您不这样做,以后可能会导致冲突显式插入值后手动更新序列。有关更新 autoinc 序列的信息,请参阅 this other question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多