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

Вмъкнете в postgres SQL

Недей така! НИКОГА ! Дори не си и помисляйте да правите това!

ТоваГРЕШНО решението може да изглежда (не) работи за вас:

INSERT INTO lists VALUES ((SELECT max(id)+1 FROM lists),'KO','SPH', '5');

НО , ако някой се опита да вмъкне едновременно с вас, и двамата ще получите един и същ id , което ще доведе до невалиден резултат. Наистина трябва да използвате sequence или някакъв по-надежден механизъм (спомагателна маса е често срещана, когато не можете да имате дупки в последователността, но има някои недостатъци [ще заключи]). Можете дори да използвате serial тип данни за улеснение (създава последователност отдолу):

CREATE TABLE lists(id serial, col2 text, col3 text, ...);
-- If you don't specify "id", it will autogenerate for you:
INSERT INTO lists(col2, col3, ...) VALUES('KO','SPH', ...);
-- You can also specify using DEFAULT (the same as above):
INSERT INTO lists(id, col2, col3, ...) VALUES(DEFAULT, 'KO','SPH', ...);

Ако наистина, наистина, НАИСТИНА, не можете да създадете и използвате последователност, можете да направите както по-горе, но ще трябва да се справите с изключението (приемайки id полето е PK или UK и използва транзакция с ангажимент за четене), нещо подобно (в PL/pgSQL):

DECLARE
    inserted bool = false;
BEGIN
    WHILE NOT inserted LOOP;
        BEGIN
            INSERT INTO lists
            VALUES ((SELECT coalesce(max(id),0)+1 FROM lists),'KO','SPH', '5');
            inserted = true;
        EXCEPTION
            WHEN unique_violation THEN
                NULL; -- do nothing, just try again
        END;
    END LOOP;
END;

Но отново, горещо ви препоръчвам да го избягвате:използвайте последователност и бъдете щастливи... =D

Освен това знам, че е пример, но използвайте изричен списък с колони на INSERT INTO клауза.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да видите коя версия на Postgres работи

  2. PostgreSQL CASE ... END с множество условия

  3. Нечувствителен към регистър като (ilike) в Datamapper с Postgresql

  4. За начинаещ, има ли голяма разлика между MySQL и PostgreSQL

  5. Проблеми с SSL връзката между контейнера go Scratch и контейнера PG. Как да разрешите?