tl;dr
Sekarang di Postgres 10, tentukan GENERATED BY DEFAULT AS IDENTITY
sesuai standar SQL.
create table tower
(
npages integer,
ifnds integer,
ifnid integer,
name varchar(20),
towid integer GENERATED BY DEFAULT AS IDENTITY -- per SQL standard
)
Kolom identitas
Postgres 10 sekarang mendukung konsep kolom identitas , dan menggunakan sintaks SQL standar. Meskipun saya bukan ahli dalam MS SQL Server, saya yakin dukungan standar baru ini setara.
GENERATED … AS IDENTITY
GENERATED … AS IDENTITY
perintah yang digunakan selama CREATE TABLE
menciptakan urutan implisit. Pembuatan, penamaan, izin, dan penghapusan urutan itu transparan bagi Anda, tidak seperti SERIAL
. Sangat intuitif sekarang. Jika Anda memberikan izin penggunaan ke tabel, mereka mendapatkan izin untuk urutannya. Jika Anda menjatuhkan meja, urutannya dijatuhkan secara otomatis.
Dua rasa dari sintaks standar. Perbedaannya hanya penting jika Anda memberikan nilai daripada membiarkan nilai dihasilkan. Biasanya, orang selalu mengandalkan nilai yang dihasilkan, jadi biasanya Anda cukup menggunakan versi pertama, GENERATED BY DEFAULT AS IDENTITY
.
GENERATED BY DEFAULT AS IDENTITY
- Menghasilkan nilai kecuali
INSERT
perintah memberikan nilai.
- Menghasilkan nilai kecuali
GENERATED ALWAYS AS IDENTITY
- Mengabaikan nilai apa pun yang diberikan oleh
INSERT
kecuali menentukanOVERRIDING SYSTEM VALUE
- Mengabaikan nilai apa pun yang diberikan oleh
Lihat CREATE TABLE
halaman untuk dokumentasi.
Baca halaman menarik ini
oleh Peter Eisentraut. Dia menjelaskan beberapa masalah aneh dengan SERIAL
. Tidak ada masalah seperti itu dengan fitur kolom identitas baru. Jadi tidak ada alasan untuk menggunakan SERIAL
lagi, tidak ada kerugian, hanya keuntungan; SERIAL
digantikan oleh GENERATED … AS IDENTITY
.
Perhatikan bahwa kolom identitas belum tentu merupakan kunci utama, dan tidak diindeks secara otomatis. Jadi Anda masih perlu menentukan PRIMARY KEY
secara eksplisit jika itu adalah niat Anda (seperti yang biasanya terjadi).
CREATE TABLE person_ (
id_
INTEGER
GENERATED BY DEFAULT AS IDENTITY -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT.
PRIMARY KEY -- Creates index. Specifies UNIQUE. Marks column for relationships.
,
name_
VARCHAR( 80 )
) ;
Tujuannya adalah agar detail implementasi internal disembunyikan dari Anda. Tidak perlu bagi Anda untuk mengetahui nama urutan yang dihasilkan di bawah penutup. Misalnya, Anda dapat mengatur ulang penghitung melalui kolom tanpa mengetahui urutan yang mendasarinya.
ALTER TABLE person_
ALTER COLUMN id_
RESTART WITH 1000 -- Reset sequence implicitly, without a name.
;
Menentukan identitas secara implisit:
- Menandai kolom
NOT NULL
- Membuat urutan
- Jenis urutan cocok dengan kolom ( 32-bit 64-bit dll. )
- Mengikat urutan ke kolom
- Mewarisi izin
- Air terjun menurun
- Tetap terikat pada kolom meskipun kolom diganti namanya
- Menentukan urutan sebagai sumber nilai default untuk kolom tersebut
Kolom identitas dapat mengambil opsi yang sama dengan CREATE SEQUENCE
:
START WITH start
MINVALUE minvalue
|NO MINVALUE
MAXVALUE maxvalue
|NO MAXVALUE
INCREMENT [ BY ] increment
CYCLE
|NO CYCLE
CACHE
tembolokOWNED BY NONE
( menentukan kepemilikan untuk kolom identitas tidak masuk akal bagi saya karena kepemilikan dikelola secara otomatis )
Contoh opsi yang konyol:
id_ INTEGER
GENERATED BY DEFAULT AS IDENTITY (
START WITH 200
MINVALUE 100
MAXVALUE 205
CYCLE
INCREMENT BY 3
) PRIMARY KEY
Menambahkan 4 baris: