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

Indsæt i postgres SQL

Gør det ikke! NOGENSINDE ! Tænk ikke engang på at gøre det!

Dette FORKERTE løsningen ser ud til (det gør den ikke) til at virke for dig:

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

MEN , hvis nogen forsøger at indsætte på samme tid som dig, vil I begge få det samme id , hvilket vil forårsage et ugyldigt resultat. Du burde virkelig bruge en sequence eller en mere pålidelig mekanisme (et hjælpebord er almindeligt, når du ikke kan have huller i rækkefølgen, men det har nogle ulemper [det vil låse]). Du kan endda bruge serial datatype for at gøre det nemmere (det opretter en sekvens nedenunder):

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

Hvis du virkelig, virkelig, VIRKELIG, ikke kan oprette og bruge en sekvens, kan du gøre som ovenstående, men du bliver nødt til at håndtere undtagelsen (forudsat id feltet er PK eller UK, og ved at bruge en læst forpligtet transaktion), sådan noget (i 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;

Men igen, jeg anbefaler dig stærkt at undgå det:brug en sekvens og vær glad... =D

Jeg ved også, at det er et eksempel, men brug en eksplicit kolonneliste på INSERT INTO klausul.




  1. Nulstil sekvensværdien til 1

  2. PHP Kan ikke oprette forbindelse til PDO ODBC-driver

  3. MySQL tabel PRIMÆR NØGLE spørgsmål?

  4. Python unicode-kodningsproblem