PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Erro de lógica do recurso PHP/MySQL INSERT


Os erros:

  • RETURNING cláusula está faltando no segundo INSERT declaração.

  • Forneça uma lista explícita de colunas para seu segundo INSERT declaração, também.

  • Não forneça NULL no INSERT declarações se você quiser que o padrão da coluna (colunas seriais?) seja ativado. Use a palavra-chave DEFAULT ou simplesmente não mencione a coluna.

A melhor solução:

Use CTE de modificação de dados , disponível desde o PostgreSQL 9.1 para fazer tudo em uma instrução e economizar uma sobrecarga e viagens de ida e volta ao servidor. (O MySQL não sabe nada do tipo, nem mesmo CTEs simples).

Além disso, pule o UPDATE remodelando a lógica. Recupere um id com nextval() , e se contentar com apenas dois INSERT declarações.

Assumindo este modelo de dados (você deveria ter fornecido isso em sua pergunta):
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 um consulta faz tudo:
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 dados


Você pode pensar em alterar seu modelo de dados para um relacionamento clássico n:m. Incluiria estas tabelas e chaves primárias:
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

Você sempre pode definir institution_staff.i_id UNIQUE , se um usuário só puder pertencer a uma institution .