sql >> Database teknologi >  >> RDS >> PostgreSQL

serie i postgres bliver øget, selvom jeg tilføjede om konflikt gør ingenting

Grunden til, at dette føles underligt for dig, er, at du tænker på stigningen på tælleren som en del af indsættelsesoperationen, og derfor burde "GØR INGENTING" betyde "forøg ikke noget". Du forestiller dig dette:

  1. Tjek værdier, der skal indsættes, mod begrænsninger
  2. Hvis duplikat opdages, skal du afbryde
  3. Forøg sekvens
  4. Indsæt data

Men faktisk skal stigningen ske før indsættelsen forsøges . En SERIAL kolonne i Postgres er implementeret som en DEFAULT som udfører nextval() funktion på en bundet SEQUENCE . Før DBMS kan gøre noget med dataene, skal det have et komplet sæt kolonner, så rækkefølgen af ​​operationer er som denne:

  1. Løs standardværdier, herunder forøgelse af sekvensen
  2. Tjek værdier, der skal indsættes, mod begrænsninger
  3. Hvis duplikat opdages, skal du afbryde
  4. Indsæt data

Dette kan ses intuitivt, hvis duplikatnøglen er i selve autoincrement-feltet:

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;

Dette kan tydeligvis ikke vide, om der er en konflikt uden at øge sekvensen, så "gør ingenting" skal komme efter denne stigning.



  1. Strengsammenkædningsoperatør i Oracle, Postgres og SQL Server

  2. Bestilt antal på hinanden følgende gentagelser / dubletter

  3. Problem med SQLiteOpenHelper på Android 2.X og 3.X

  4. Sådan fungerer CHAR()-funktionen i SQL Server (T-SQL)