sql >> Database >  >> RDS >> PostgreSQL

Logische fout in PHP/MySQL INSERT-functie

De fouten:

  • RETURNING clausule ontbreekt in de tweede INSERT verklaring.

  • Geef een expliciete lijst met kolommen op voor uw tweede INSERT verklaring ook.

  • Geef geen NULL op in de INSERT uitspraken als u wilt dat de standaardkolom (seriële kolommen?) in werking treedt. Gebruik het trefwoord DEFAULT of noem de kolom gewoon helemaal niet.

De betere oplossing:

Gebruik data-moidifying CTE , beschikbaar sinds PostgreSQL 9.1 om het allemaal in één verklaring te doen en overhead en retourvluchten naar de server te besparen. (MySQL weet niets van dien aard, zelfs geen gewone CTE's).

Sla ook de UPDATE . over door de logica opnieuw te modelleren. Haal één id op met nextval() , en doe het met slechts twee INSERT verklaringen.

Uitgaande van dit gegevensmodel (dat had u in uw vraag moeten vermelden):

CREATE TABLE institutions(i_id serial, name text, u_id int);
CREATE TABLE staff(user_id serial, username text, password text, i_id int);

Deze een query doet het allemaal:

WITH x AS (
    INSERT INTO staff(username, password, i_id) -- provide column list
    VALUES ('$username', '$password', nextval('institutions_i_id_seq'))
    RETURNING user_id, i_id
    )
INSERT INTO institutions (i_id, u_id, name)
SELECT x.i_id, x.user_id, '$institution'
FROM   x
RETURNING u_id, i_id; -- if you need the values back, else you are done

Gegevensmodel

U kunt overwegen uw gegevensmodel te wijzigen in een klassieke n:m-relatie. Zou deze tabellen en primaire sleutels bevatten:

staff (u_id serial PRIMARY KEY, ...)
institution (i_id serial PRIMARY KEY, ...)
institution_staff (i_id, u_id, ...,  PRIMARY KEY(i_id, u_id)) -- implements n:m

U kunt institution_staff.i_id UNIQUE altijd definiëren , als een gebruiker maar tot één institution kan behoren .




  1. Cassandra maskeren met IRI FieldShield

  2. Hoe kan ik de externe sleutels van een tabel in mysql krijgen?

  3. Beste manier om grote (UUID) als primaire sleutel van MySQL-tabel te verwerken

  4. Java-uitzonderingsfout - Sqlite prepareStatement.setBlob