sql >> Databáze >  >> RDS >> PostgreSQL

Vložit do postgres SQL

Nedělejte to! NIKDY ! Ani na to nemyslete!

Toto ŠPATNĚ řešení se může zdát (nefunguje) pro vás:

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

ALE , pokud se někdo pokusí vložit ve stejnou dobu jako vy, oba dostanete stejné id , což způsobí neplatný výsledek. Opravdu byste měli použít sequence nebo nějaký spolehlivější mechanismus (pomocná tabulka je běžná, když v sekvenci nemůžete mít díry, ale má to určité nevýhody [zablokuje se]). Můžete dokonce použít serial datový typ, aby to bylo snazší (vytváří sekvenci pod):

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', ...);

Pokud opravdu, opravdu, OPRAVDU, nemůžete vytvořit a použít sekvenci, můžete to udělat jako výše, ale budete muset zvládnout výjimku (za předpokladu id pole je PK nebo UK a pomocí transakce potvrzené čtením), něco takového (v 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;

Ale opět vám vřele doporučuji se tomu vyhnout:použijte sekvenci a buďte šťastní... =D

Také vím, že je to příklad, ale použijte explicitní seznam sloupců na INSERT INTO doložka.




  1. Jak se vyhnout uzamčení dodavatele cloudu PostgreSQL

  2. CHYBA 1452 (23000):Nelze přidat nebo aktualizovat podřízený řádek:omezení cizího klíče se nezdaří

  3. Jaké je optimální číslo dotazu MYSQL v php skriptu?

  4. Kód chyby:1222. Použité příkazy SELECT mají jiný počet sloupců