簡體   English   中英

具有DEFAULT ID的INSERT在PostgreSQL中不起作用

[英]INSERT with DEFAULT id doesn't work in PostgreSQL

我嘗試在Postgres中運行以下語句:

insert into field (id, name) values (DEFAULT, 'Me')

我得到這個錯誤:

ERROR: null value in column "id" violates not-null constraint

我最終不得不手動設置ID。 問題是當我的應用插入記錄時,出現重復的鍵錯誤。 我正在使用Play框架和ebean ORM構建Java應用程序。 因此,整個架構是由ebean自動生成的。 在這種情況下,將記錄手動插入數據庫的最佳實踐是什么?

編輯:
這是我創建Field類的方法

@Entity
public class Field {
    @id
    public Long id;
    public String name;
}

編輯:
我檢查了field_seq序列,它看起來像這樣:

CREATE SEQUENCE public.field_seq INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1; 

編輯:
這是pgAdmin III中生成的SQL:

CREATE TABLE field
(
  id bigint NOT NULL,
  created timestamp without time zone,
  modified timestamp without time zone,
  name character varying(255),
  enabled boolean,
  auto_set boolean,
  section character varying(17),
  input_type character varying(8),
  user_id bigint,
  CONSTRAINT pk_field PRIMARY KEY (id),
  CONSTRAINT fk_field_user_3 FOREIGN KEY (user_id)
      REFERENCES account (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT ck_field_input_type CHECK (input_type::text = ANY (ARRAY['TEXT'::character varying, 'TEXTAREA'::character varying]::text[])),
  CONSTRAINT ck_field_section CHECK (section::text = ANY (ARRAY['MAIN_CONTACT_INFO'::character varying, 'PARTICIPANT_INFO'::character varying]::text[]))
);

CREATE INDEX ix_field_user_3
  ON field
  USING btree
  (user_id);

沒有field.id 定義默認的列 由於序列public.field_seq似乎已經存在(但未附加到field.id ),因此可以使用以下方法進行修復:

ALTER SEQUENCE field_seq OWNED BY field.id;

ALTER TABLE field
ALTER COLUMN id SET DEFAULT (nextval('field_seq'::regclass));

但是,請確保該序列沒有被其他東西使用。

首先創建像這樣的表會更簡單

CREATE TABLE field
(
  id bigserial PRIMARY KEY,
  ...
);

手冊中有關serialbigserial詳細信息。
不確定Play框架是如何實現的。

這可行。

insert into field (id, name) values (nextval('field_seq'), "Me");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM