Saya beralih dari MySQL ke PostgreSQL dan bertanya-tanya bagaimana saya bisa melakukan nilai autoincrement. Saya melihat di PostgreSQL mendokumentasikan datatype "serial", tapi saya mendapatkan kesalahan sintaks saat menggunakannya (dalam v8.0).
579
Jawaban:
Ya, SERIAL adalah fungsi yang setara.
SERIAL hanyalah makro waktu pembuatan tabel di sekitar sekuens. Anda tidak dapat mengubah SERIAL ke kolom yang ada.
sumber
"Table"
dan"table"
kemudian hanya meninggalkannya kuotasi dan canonicalize ketable
. Konvensi ini tidak pernah menggunakan kutipan dalam hal. Anda dapat, jika ingin, menggunakan nama case campuran untuk penampilan, hanya saja tidak memerlukannya:CREATE TABLE fooBar ( .. ); SELECT * FROM fooBar;
akan berfungsi, seperti yang akan terjadiSELECT * FROM foobar
.Anda dapat menggunakan tipe data integer lainnya , seperti
smallint
.Contoh:
Lebih baik menggunakan tipe data Anda sendiri, daripada tipe data serial pengguna .
sumber
CREATE SEQUENCE
postgresql.org/docs/8.1/interactive/sql-createsequence.html ) . NAMUN, saya tidak yakin mengapa Anda mengubah pemiliknya.Jika Anda ingin menambahkan urutan ke id di tabel yang sudah ada, Anda dapat menggunakan:
sumber
ALTER COLUMN user_id
?ERROR: syntax error at or near "DEFAULT"
Ada saran?Walaupun sepertinya urutannya setara dengan MySQL auto_increment, ada beberapa perbedaan yang halus tetapi penting:
1. Permintaan Gagal Peningkatan Urutan / Serial
Kolom serial akan bertambah pada kueri yang gagal. Ini mengarah ke fragmentasi dari kueri yang gagal, bukan hanya penghapusan baris. Sebagai contoh, jalankan query berikut pada database PostgreSQL Anda:
Anda harus mendapatkan output berikut:
Perhatikan bagaimana Anda beralih dari 1 ke 3 bukannya 1 ke 2.
Ini masih terjadi jika Anda secara manual membuat urutan Anda sendiri dengan:
Jika Anda ingin menguji perbedaan MySQL, jalankan yang berikut di database MySQL:
Anda harus mendapatkan yang berikut tanpa frmentasi :
2. Mengatur Nilai Kolom Serial Secara Manual Dapat Menyebabkan Gagal Permintaan Masa Depan.
Ini ditunjukkan oleh @trev dalam jawaban sebelumnya.
Untuk mensimulasikan ini secara manual atur uid ke 4 yang akan "clash" nanti.
Data tabel:
Jalankan sisipan lain:
Data tabel:
Sekarang jika Anda menjalankan sisipan lain:
Ini akan gagal dengan pesan kesalahan berikut:
Sebaliknya, MySQL akan menangani ini dengan anggun seperti yang ditunjukkan di bawah ini:
Sekarang masukkan baris lain tanpa pengaturan uid
Permintaan tidak gagal, Anda hanya perlu melompat ke 5:
Pengujian dilakukan pada MySQL 5.6.33, untuk Linux (x86_64) dan PostgreSQL 9.4.9
sumber
Dimulai dengan Postgres 10, kolom identitas seperti yang didefinisikan oleh standar SQL juga didukung:
membuat kolom identitas yang tidak bisa diganti kecuali diminta secara eksplisit. Sisipan berikut akan gagal dengan kolom yang didefinisikan sebagai
generated always
:Namun ini dapat ditolak:
Saat menggunakan opsi
generated by default
ini pada dasarnya perilaku yang sama denganserial
implementasi yang ada :Ketika nilai diberikan secara manual, urutan yang mendasarinya perlu disesuaikan secara manual juga - sama seperti dengan
serial
kolom.Kolom identitas bukan kunci utama secara default (seperti
serial
kolom). Jika harus satu, batasan kunci primer perlu didefinisikan secara manual.sumber
Maaf, untuk mengulangi pertanyaan lama, tapi ini adalah pertanyaan / jawaban Stack Overflow pertama yang muncul di Google.
Posting ini (yang muncul pertama kali di Google) berbicara tentang penggunaan sintaks yang lebih diperbarui untuk PostgreSQL 10: https://blog.2ndquadrant.com/postgresql-10-identity-columns/
yang kebetulan adalah:
Semoga itu bisa membantu :)
sumber
GENERATED … AS IDENTITY
perintahnya adalah SQL standar. Pertama ditambahkan dalam SQL: 2003 , kemudian diklarifikasi dalam SQL: 2008 . Lihat fitur # T174 & F386 & T178.Anda harus berhati-hati untuk tidak memasukkan langsung ke bidang SERIAL atau urutan Anda, jika tidak, penulisan Anda akan gagal ketika urutan mencapai nilai yang dimasukkan:
sumber
Dalam konteks pertanyaan yang diajukan dan sebagai balasan atas komentar oleh @ sereja1c, membuat
SERIAL
secara implisit menciptakan urutan, jadi untuk contoh di atas-CREATE TABLE
secara implisit akan membuat urutanfoo_id_seq
untuk kolom serialfoo.id
. Karenanya,SERIAL
[4 Bytes] bagus untuk kemudahan penggunaan kecuali Anda membutuhkan tipe data khusus untuk id Anda.sumber
Cara ini pasti akan berhasil, saya harap ini membantu:
Anda dapat memeriksa detail ini di tautan berikutnya: http://www.postgresqltutorial.com/postgresql-serial/
sumber
Sejak PostgreSQL 10
sumber