PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Erreur de logique de fonctionnalité PHP/MySQL INSERT

Les erreurs :

  • RETURNING la clause est manquante dans le deuxième INSERT déclaration.

  • Fournissez une liste explicite de colonnes pour votre deuxième INSERT déclaration, aussi.

  • Ne pas fournir NULL dans le INSERT déclarations si vous voulez que la colonne par défaut (colonnes en série ?) entre en jeu. Utilisez le mot-clé DEFAULT ou ne mentionnez pas du tout la colonne.

La meilleure solution :

Utilisez CTE de modification des données , disponible depuis PostgreSQL 9.1 pour tout faire en une seule instruction et économiser une surcharge et des allers-retours vers le serveur. (MySQL ne sait rien de la sorte, pas même les CTE simples).

Ignorez également la UPDATE en remodelant la logique. Récupérez un identifiant avec nextval() , et se contenter de deux INSERT déclarations.

En supposant ce modèle de données (vous auriez dû le fournir dans votre question) :

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

Ce celui la requête fait tout :

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

Modèle de données

Vous pourriez envisager de remplacer votre modèle de données par une relation n:m classique. Cela inclurait ces tables et clés primaires :

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

Vous pouvez toujours définir institution_staff.i_id UNIQUE , si un utilisateur ne peut appartenir qu'à un seul institution .