PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

сериен в postgres се увеличава, въпреки че добавих на конфликт не прави нищо

Причината, поради която това ви се струва странно, е, че мислите за увеличението на брояча като част от операцията за вмъкване и следователно „НЕ ПРАВИ НИЩО“ би трябвало да означава „не увеличавайте нищо“. Представяте си това:

  1. Проверете стойностите за вмъкване спрямо ограничение
  2. Ако се открие дубликат, прекратете
  3. Последователност на нарастване
  4. Вмъкване на данни

Но всъщност увеличението трябва да се случи преди да се направи опит за вмъкване . A SERIAL колоната в Postgres е внедрена като DEFAULT който изпълнява nextval() функция върху обвързана SEQUENCE . Преди СУБД да може да направи нещо с данните, тя трябва да има пълен набор от колони, така че редът на операциите е следният:

  1. Разрешаване на стойностите по подразбиране, включително увеличаване на последователността
  2. Проверете стойностите за вмъкване спрямо ограничение
  3. Ако се открие дубликат, прекратете
  4. Вмъкване на данни

Това може да се види интуитивно, ако дублираният ключ е в самото поле за автоматично увеличение:

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;

Ясно е, че това не може да знае дали има конфликт без увеличаване на последователността, така че "не прави нищо" трябва да дойде след това увеличение.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. LIKE заявка за елементи от плосък jsonb масив

  2. Postgres:проверете дали полето на масива съдържа стойност?

  3. Съхранение на часовата зона във времеви печат на тип данни с часова зона

  4. Търсене в пълен текст от PostgreSQL 8.3

  5. Как да конвертирате низ в числова стойност в PostgreSQL