sql >> Database >  >> RDS >> PostgreSQL

Invoegen in postgre SQL

Doe dat niet! OOIT ! Denk er niet eens aan om dat te doen!

Deze VERKEERDE oplossing lijkt misschien (niet) voor u te werken:

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

MAAR , als iemand tegelijkertijd met jou probeert in te voegen, krijgen jullie allebei dezelfde id , wat een ongeldig resultaat zal veroorzaken. Je zou echt een sequence moeten gebruiken of een betrouwbaarder mechanisme (een hulptabel is gebruikelijk als je geen gaten in de reeks kunt hebben, maar het heeft enkele nadelen [hij zal vergrendelen]). Je kunt zelfs serial . gebruiken gegevenstype om het gemakkelijker te maken (het creëert een reeks eronder):

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

Als je echt, echt, ECHT geen reeks kunt maken en gebruiken, kun je het bovenstaande doen, maar je zult met de uitzondering moeten omgaan (ervan uitgaande dat de id veld is PK of UK, en gebruik een read-committe transactie), zoiets (in 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;

Maar nogmaals, ik raad je ten zeerste aan om het te vermijden:gebruik een reeks en wees gelukkig... =D

Ik weet ook dat het een voorbeeld is, maar gebruik de lijst met expliciete kolommen op INSERT INTO clausule.




  1. OrderBy in SQL Server om positieve waarden voor negatieve waarden te plaatsen

  2. Slaapstandprobleem:moet voorkomen in de GROUP BY-clausule of worden gebruikt in een aggregatiefunctie

  3. Update met een subquery in MySQL

  4. Mysql:Hoe kan ik RTRIM gebruiken in mijn LOAD DATA INFILE-query?