Closed5
postgresql serial を調べる
- DDL
CREATE TABLE test_serial (
id SERIAL NOT NULL,
name TEXT NOT NULL
);
- 最初に id = 3 を設定してしまう
insert into test_serial (id, name) values (3, 'test1');
SELECT * FROM test_serial;
3,test1
- id を指定せずにどんどんレコードを追加していく
INSERT INTO test_serial (name) values ('test4'); -- id = 4 と想定した。間違ったw
INSERT INTO test_serial (name) values ('test2'); -- 2個目
INSERT INTO test_serial (name) values ('test3'); -- 3個目
INSERT INTO test_serial (name) values ('test4');
INSERT INTO test_serial (name) values ('test5');
SELECT * FROM test_serial;
3,test1
1,test2
2,test3
3,test4
4,test5
結果、serial カラムを指定した場合はインクリメントしないためか、id の値が 1 から振り分けられる。
- serial カラムを primary key にしてみる
CREATE TABLE test_serial (
id SERIAL PRIMARY KEY ,
name TEXT NOT NULL
);
insert into test_serial (id, name) values (3, 'test1');
insert into test_serial (name) values ('test2');
insert into test_serial (name) values ('test3');
SELECT * FROM test_serial;
3,test1
1,test2
2,test3
- 指定した id = 3 と同じ値になる場合は1回エラーが発生
INSERT INTO test_serial (name) values ('test4'); -- id = 3 にインクリメントする場合はどうなるか?
[23505] ERROR: duplicate key value violates unique constraint "test_serial_pkey" Detail: Key (id)=(3) already exists.
- 👆と同じコマンドをもう1回実行すると 3 をスキップして 4 になった(エラー発生せず)
INSERT INTO test_serial (name) values ('test4'); --
SELECT * FROM test_serial;
3,test1
1,test2
2,test3
4,test4
- serial カラムに対して
DEFAULT
を insert する
INSERT INTO test_serial (id, name) values (DEFAULT, 'test4');
SELECT * FROM test_serial;
3,test1
1,test2
2,test3
4,test4
5,test5
DEFAULT
を 指定する場合、インクリメントすることになる
start value を指定する場合
- https://postgresweb.com/post-5455
- 例: 101 から始まる
CREATE TABLE test_serial (
id SERIAL NOT NULL,
name TEXT NOT NULL
);
-- 101 から始まる連番を採番する
SELECT setval(pg_get_serial_sequence('test_serial', 'id'), 100, true);
sequence_name & current value
- sequence_name を取得
select sequence_schema, sequence_name
from information_schema.sequences;
- current name 取得
SELECT last_value FROM sequence_name;
このスクラップは2023/09/25にクローズされました