我的数据库正在使用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)
);
答案 0 :(得分:71)
使用DEFAULT
关键字或省略INSERT
列表中的列:
INSERT INTO dataset (id, age, name, description)
VALUES (DEFAULT, 42, 'fred', 'desc');
INSERT INTO dataset (age, name, description)
VALUES (42, 'fred', 'desc');
答案 1 :(得分:5)
如果您创建一个带有串行列的表,那么当您将数据插入表中时省略了串行列,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)
答案 2 :(得分:0)
这些查询对我有用:
insert into <table_name> (all columns without id serial)
select (all columns without id serial)
FROM <source> Where <anything>;
答案 3 :(得分:0)
在这种情况下,插入多行对我不起作用:
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次。糟糕...