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

Cara membuat yang setara dengan kolom identitas SQL Server di Postgres

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.
  • GENERATED ALWAYS AS IDENTITY
    • Mengabaikan nilai apa pun yang diberikan oleh INSERT kecuali menentukan OVERRIDING SYSTEM VALUE

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 tembolok
  • OWNED 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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masukkan NULL ke dalam DB PostgreSQL melalui PHP ketika bidang tanggal kosong

  2. Apakah baris dikunci secara berurutan dalam pernyataan SELECT ... ORDER BY ... FOR UPDATE?

  3. Inisialisasi Postgres db di Docker Compose

  4. psycopg2:masukkan beberapa baris dengan satu kueri

  5. PGSQL tidak dimuat di PHP 5.3 Windows di bawah IIS