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

serial di postgres sedang ditingkatkan meskipun saya menambahkan konflik tidak melakukan apa-apa

Alasan mengapa ini terasa aneh bagi Anda adalah karena Anda memikirkan kenaikan pada penghitung sebagai bagian dari operasi penyisipan, dan oleh karena itu "DO NOTHING" seharusnya berarti "jangan menambah apa pun". Anda sedang membayangkan ini:

  1. Periksa nilai yang akan disisipkan terhadap batasan
  2. Jika duplikat terdeteksi, batalkan
  3. Urutan kenaikan
  4. Sisipkan data

Namun pada kenyataannya, kenaikan harus terjadi sebelum penyisipan dicoba . Sebuah SERIAL kolom di Postgres diimplementasikan sebagai DEFAULT yang mengeksekusi nextval() berfungsi pada SEQUENCE yang terikat . Sebelum DBMS dapat melakukan apapun dengan data, DBMS harus memiliki satu set kolom yang lengkap, sehingga urutan operasinya seperti ini:

  1. Menyelesaikan nilai default, termasuk menambah urutan
  2. Periksa nilai yang akan disisipkan terhadap batasan
  3. Jika duplikat terdeteksi, batalkan
  4. Sisipkan data

Ini dapat dilihat secara intuitif jika kunci duplikat ada di bidang peningkatan otomatis itu sendiri:

CREATE TABLE foo ( id SERIAL NOT NULL PRIMARY KEY, bar text );
-- Insert row 1
INSERT INTO foo ( bar ) VALUES ( 'test' );
-- Reset the sequence
SELECT setval(pg_get_serial_sequence('foo', 'id'), 0, true);
-- Attempt to insert row 1 again
INSERT INTO foo ( bar ) VALUES ( 'test 2' )
     ON CONFLICT (id) DO NOTHING;

Jelas, ini tidak dapat mengetahui apakah ada konflik tanpa menambah urutan, jadi "tidak melakukan apa-apa" harus muncul setelah kenaikan itu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Melakukan Perubahan Topologi Replikasi untuk PostgreSQL

  2. Cara terbaik untuk memeriksa nilai kosong atau nol

  3. Bagaimana cara menggunakan % operator dari ekstensi pg_trgm?

  4. Mengkompilasi ekstensi mongo_fdw yang dapat ditulis pada format biner instalasi PostgreSQL.

  5. Pernyataan Postgresql Sederhana - nama kolom tidak ada