sql >> Base de Datos >  >> RDS >> PostgreSQL

Error de lógica de la función INSERT de PHP/MySQL

Los errores:

  • RETURNING falta la cláusula en el segundo INSERT declaración.

  • Proporcione una lista explícita de columnas para su segundo INSERT declaración, también.

  • No proporcione NULL en el INSERT declaraciones si desea que se active la columna predeterminada (¿columnas en serie?). Use la palabra clave DEFAULT o simplemente no mencionar la columna en absoluto.

La mejor solución:

Use modificación de datos CTE , disponible desde PostgreSQL 9.1 para hacerlo todo en una declaración y ahorrar gastos generales y viajes de ida y vuelta al servidor. (MySQL no sabe nada de eso, ni siquiera CTE simple).

Además, omita la UPDATE remodelando la lógica. Recupere una identificación con nextval() , y conformarse con solo dos INSERT declaraciones.

Asumiendo este modelo de datos (debe haberlo proporcionado en su pregunta):

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

Este uno la consulta lo hace todo:

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

Modelo de datos

Podría pensar en cambiar su modelo de datos a una relación n:m clásica. Incluiría estas tablas y claves principales:

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

Siempre puede definir institution_staff.i_id UNIQUE , si un usuario solo puede pertenecer a una institution .