PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Ganti nama tabel dengan aman menggunakan kolom kunci utama serial

serial bukan tipe data yang sebenarnya. Manual tersebut menyatakan:

Tipe data smallserial , serial dan bigserial 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 (atau int2 / int8 masing-masing untuk smallserial / 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres - Ubah daftar adjacency menjadi objek JSON bersarang

  2. Membagi Data Anda Dengan PostgreSQL 11

  3. 2 Cara Menambahkan Angka Nol di PostgreSQL

  4. Pilih kolom dengan nama kolom tertentu di PostgreSQL

  5. Ketidakcocokan Openshift dan net-ssh? (2.9.3-beta1 vs 2.9.2)