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 を指定する場合

CREATE TABLE test_serial (
    id SERIAL NOT NULL,
    name TEXT NOT NULL
);
-- 101 から始まる連番を採番する
SELECT setval(pg_get_serial_sequence('test_serial', 'id'), 100, true);
このスクラップは2023/09/25にクローズされました