serial
bukan tipe data yang sebenarnya. Manual tersebut menyatakan:
Tipe data
smallserial
,serial
danbigserial
bukan tipe sebenarnya, tetapi hanya kenyamanan notasi untuk membuat kolom pengenal unik
Tipe data semu diselesaikan dengan melakukan semua ini:
-
buat urutan bernama
tablename_colname_seq
-
buat kolom dengan ketik
integer
(atauint2
/int8
masing-masing untuksmallserial
/bigserial
) -
buat kolom
NOT NULL DEFAULT nextval('tablename_colname_seq')
-
buat kolom memiliki urutannya, sehingga dihapus secara otomatis
Sistem tidak tahu apakah Anda melakukan semua ini dengan tangan atau dengan tipe data semu serial
. pgAdmin memeriksa fitur yang terdaftar dan jika semuanya terpenuhi, skrip DDL yang direkayasa ulang disederhanakan dengan serial
yang cocok Tipe. Jika salah satu fitur tidak terpenuhi, penyederhanaan ini tidak terjadi. Itu adalah sesuatu yang dilakukan pgAdmin. Untuk tabel katalog yang mendasari semuanya sama. Tidak ada serial
ketik seperti itu.
Tidak ada cara untuk secara otomatis mengganti nama urutan yang dimiliki. Anda dapat menjalankan:
ALTER SEQUENCE ... RENAME TO ...
seperti yang Anda lakukan. Sistem itu sendiri tidak peduli dengan nama . Kolom DEFAULT
menyimpan OID
('foo_pkey_seq'::regclass
), Anda dapat mengubah nama urutan tanpa merusaknya - OID tetap sama. Hal yang sama berlaku untuk kunci asing dan referensi serupa di dalam database.
Indeks implisit untuk kunci utama terikat dengan nama batasan PK, yang akan tidak berubah jika Anda mengubah nama tabel. Di Postgres 9.2 atau lebih baru Anda dapat menggunakan
ALTER TABLE ... RENAME CONSTRAINT ..
untuk memperbaikinya juga.
Ada juga indeks yang dinamai mengacu pada nama tabel. Prosedur serupa:
ALTER INDEX .. RENAME TO ..
Anda dapat memiliki semua jenis referensi informal untuk nama tabel. Sistem tidak dapat secara paksa mengganti nama objek yang dapat diberi nama apa pun yang Anda suka. Dan itu tidak peduli.
Tentu saja Anda tidak ingin membatalkan kode SQL yang mereferensikan nama-nama itu. Jelas, Anda tidak ingin mengubah nama saat logika aplikasi merujuknya. Biasanya ini tidak akan menjadi masalah untuk nama indeks, urutan, atau batasan, karena itu biasanya tidak dirujuk dengan nama.
Postgres juga memperoleh kunci pada objek sebelum mengganti namanya. Jadi jika ada transaksi bersamaan buka yang memiliki jenis kunci apa pun pada objek yang dimaksud, RENAME
. Anda operasi terhenti sampai transaksi tersebut komit atau mundur.
Katalog dan OID sistem
Skema database disimpan dalam tabel katalog sistem di skema sistem pg_catalog
. Semua detail dalam manual di sini. Jika Anda tidak tahu persis apa yang Anda lakukan, Anda tidak boleh mengacaukan tabel itu sama sekali . Satu langkah salah dan Anda dapat merusak database Anda. Gunakan perintah DDL yang disediakan Postgres.
Untuk beberapa tabel yang paling penting, Postgres menyediakan tipe pengenal objek dan tipe gips untuk mendapatkan nama untuk OID dan sebaliknya dengan cepat. Seperti:
SELECT 'foo_pkey_seq'::regclass
Jika nama skema ada di search_path
dan nama tabelnya unik, yang memberi Anda sama dengan:
SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';
Kunci utama dari sebagian besar tabel katalog adalah oid
dan secara internal, sebagian besar referensi menggunakan OID.