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

显然,您希望 INSERT 跳过 device_id,因为它是主键并且具有来自序列的默认值。这不会发生,所以 PostgreSQL 认为你的意思是这样的:

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

如果您坚持不明确列出您的列(并使维护您的代码的人不必要地遭受痛苦),那么您可以DEFAULT在 中指定VALUES告诉 PostgreSQL 使用 PK 的默认值;来自精美手册

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 回答