postgresql 如何将记录插入到具有用SERIAL函数声明的列的表中

rryofs0p  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(5)|浏览(127)

我的数据库使用PostgreSQL。一个表使用serial自动增量宏。如果我想在表中插入一条记录,我是否还需要指定该值,或者它会自动为我分配?

CREATE TABLE dataset
(
    id serial NOT NULL,
    age integer NOT NULL,
    name character varying(32) NOT NULL,
    description text NOT NULL DEFAULT ''::text
    CONSTRAINT dataset_pkey PRIMARY KEY (id)
);
3lxsmp7m

3lxsmp7m1#

使用DEFAULT关键字或从INSERT列表中省略列:

INSERT INTO dataset (id, age, name, description)
VALUES (DEFAULT, 42, 'fred', 'desc');

INSERT INTO dataset (age, name, description)
VALUES (42, 'fred', 'desc');
baubqpgj

baubqpgj2#

如果你创建了一个带有序列列的表,那么如果你在向表中插入数据时忽略了序列列,PostgreSQL将自动使用序列并保持顺序。
示例:

skytf=> create table test_2 (id serial,name varchar(32));
NOTICE:  CREATE TABLE will create implicit sequence "test_2_id_seq" for serial column "test_2.id"
CREATE TABLE

skytf=> insert into test_2 (name) values ('a');
INSERT 0 1
skytf=> insert into test_2 (name) values ('b');
INSERT 0 1
skytf=> insert into test_2 (name) values ('c');
INSERT 0 1

skytf=> select * From test_2;
 id | name 
----+------
  1 | a
  2 | b
  3 | c
(3 rows)
6psbrbz9

6psbrbz93#

这些查询对我有用:

insert into <table_name> (all columns without id serial)
select (all columns without id serial)
 FROM <source> Where <anything>;
igetnqfo

igetnqfo4#

在这种情况下,插入多行对我不起作用:

create table test (
  id bigint primary key default gen_id(),
  msg text not null
)

insert into test (msg)
select gs
from generate_series(1,10) gs;

因为我错误地将gen_id函数标记为IMMUTABLE。
插入查询被优化为只调用该函数一次而不是10次。哎呀...

xxslljrj

xxslljrj5#

例如,创建**“person”表**,“id”serial,**“name”**如下所示:

CREATE TABLE person (
  id serial PRIMARY KEY,
  name VARCHAR(50)
)

然后,可以对serial的**“id”使用DEFAULT,插入不带列(字段)名**的行,如下图所示:

INSERT INTO person VALUES (DEFAULT, 'John'), (DEFAULT, 'Tom');
postgres=# SELECT * FROM person;
 id | name
----+------
  1 | John
  2 | Tom

相关问题