sql >> Databasteknik >  >> RDS >> PostgreSQL

Infoga i postgres SQL

Gör inte det! NÅGONSIN ! Tänk inte ens på att göra det!

Detta FEL lösning kan tyckas (det gör det inte) att fungera för dig:

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

MEN , om någon försöker infoga samtidigt som du, skulle ni båda få samma id , vilket kommer att orsaka ett ogiltigt resultat. Du borde verkligen använda en sequence eller någon mer pålitlig mekanism (ett hjälpbord är vanligt när du inte kan ha hål i sekvensen, men det har vissa nackdelar [det kommer att låsa]). Du kan till och med använda serial datatyp för att göra det enklare (det skapar en sekvens under):

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

Om du verkligen, verkligen, VERKLIGEN, inte kan skapa och använda en sekvens, kan du göra som ovan, men du måste hantera undantaget (förutsatt att id fältet är PK eller UK, och med en läs-beslutad transaktion, något liknande (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 återigen, jag rekommenderar dig starkt att undvika det:använd en sekvens och var glad... =D

Jag vet också att det är ett exempel, men använd explicit kolumnlista på INSERT INTO klausul.




  1. Använder sp_help_jobschedule i SQL Server

  2. LISTAGG() Funktion i Oracle

  3. Kan jag lagra arrays i hstore med Rails

  4. ODP.NET Integrated Security Ogiltigt anslutningssträngargument