0

pgadmin3 を使用して次の挿入ステートメントを実行しようとしています。

INSERT INTO device 
VALUES
(12345, 
'asdf',
'OY8YuDFLYdv', 
'2', 
'myname', 
'2013-04-24 11:30:08',
 Null,Null)

しかし、次のエラーメッセージが表示され続けます。

ERROR:  invalid input syntax for integer: "asdf"
LINE 4: 'asdf',
        ^


********** Error **********

ERROR: invalid input syntax for integer: "asdf"
SQL state: 22P02
Character: 42

テーブル定義は次のとおりです。

CREATE TABLE device
(
  device_id integer NOT NULL DEFAULT nextval('device_device_id_seq'::regclass),
  userid integer NOT NULL,
  description character varying(255),
  password character varying(255) NOT NULL,
  user_id integer NOT NULL,
  createdname character varying(255),
  createddatetime timestamp without time zone,
  updatedname character varying(255),
  updateddatetime timestamp without time zone,
  CONSTRAINT device_pkey PRIMARY KEY (device_id )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE device
  OWNER TO appadmin;

どこが間違っているのか教えてもらえますか? 一重引用符を二重引用符に変更しようとしましたが、それは役に立ちませんでした。必要がない場合は、INSERT にすべての列名をリストする必要はありません。

ありがとう。

4

1 に答える 1

4

device_idINSERTは主キーであり、シーケンスからのデフォルトがあるため、明らかに INSERT がスキップされることを期待してい ます。それは起こらないので、PostgreSQLはあなたがこれを意味していると考えています:

insert into device (device_id, userid, ...)
            values (12345,     'asdf', ...);

列を明示的にリストしないことを主張する (そして、コードを維持する人々を不必要に苦しめることになる) 場合は、 で指定DEFAULTしてVALUES、PK のデフォルト値を使用するように PostgreSQL に指示できます。細かいマニュアルから:

INSERT INTO table_name [ ( column_name [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

[...] DEFAULT
対応する列にはデフォルト値が入力されます。

例えば:

INSERT INTO device 
VALUES
(DEFAULT,
12345, 
'asdf',
...

しかし、実際には、スキーマが変更されたときに SQL を理解しやすくし、より堅牢にするために、列を指定する必要があります。

于 2013-04-24T17:35:51.633 に答える