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

PHP/MySQL INSERT funktionslogikfejl

Fejlene:

  • RETURNERER klausul mangler i den anden INSERT erklæring.

  • Angiv en eksplicit liste over kolonner til din anden INSERT erklæring også.

  • Angiv ikke NULL i INSERT udsagn hvis du ønsker, at kolonnens standard (serielle kolonner?) skal slå ind. Brug nøgleordet DEFAULT eller bare slet ikke nævne kolonnen.

Den bedre løsning:

Brug data-moidifying CTE , tilgængelig siden PostgreSQL 9.1 til at gøre det hele i én erklæring og gemme en overhead og rundrejser til serveren. (MySQL kender intet til den slags, ikke engang almindelige CTE'er).

Spring også OPDATERING over ved at ommodellere logikken. Hent ét id med nextval() , og nøjes med kun to INSERT udsagn.

Forudsat denne datamodel (det skulle du have angivet i dit spørgsmål):

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

Denne en forespørgsel gør det hele:

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

Datamodel

Du overvejer måske at ændre din datamodel til et klassisk n:m-forhold. Vil inkludere disse tabeller og primærnøgler:

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

Du kan altid definere institution_staff.i_id UNIQUE , hvis en bruger kun kan tilhøre én institution .




  1. XAMPP Start automatisk ved opstart af Windows 7

  2. Python og Django OperationalError (2006, 'MySQL-serveren er gået væk')

  3. Mest sete videoer i denne uge

  4. hvordan man grupperer efter og returnerer sumrække i Postgres