2

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 によって自動的に生成されます。この場合、データベースにレコードを手動で挿入するためのベスト プラクティスは何ですか?

編集:
これが私のフィールドクラスの作成方法です

@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);
4

2 に答える 2

5

には列のデフォルトが定義されていません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,
  ...
);

詳細はマニュアルserialまたはbigserialマニュアルを参照してください。
Play フレームワークがこれをどのように実装しているかは不明です。

于 2013-01-21T20:16:03.300 に答える
1

これは機能します。

insert into field (id, name) values (nextval('field_seq'), "Me");
于 2013-01-24T01:14:13.170 に答える