PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PHP/MySQL INSERT функция логическа грешка

Грешките:

  • RETURNING липсва клауза във втория INSERT изявление.

  • Осигурете изричен списък от колони за вашия втори INSERT изявление също.

  • Не предоставяйте NULL в INSERT изявления ако искате колоната по подразбиране (серийни колони?) да започне. Използвайте ключовата дума DEFAULT или просто не споменавайте колоната изобщо.

По-доброто решение:

Използвайте моидифициране на данни CTE , наличен от PostgreSQL 9.1, за да направите всичко в един оператор и да спестите режийни разходи и двупосочни пътувания до сървъра. (MySQL не знае нищо подобно, дори обикновени CTE).

Освен това пропуснете UPDATE чрез повторно моделиране на логиката. Извлечете един идентификатор с nextval() и се задоволявайте само с два INSERT изявления.

Ако приемем този модел на данни (трябва да сте посочили това във вашия въпрос):

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

Този един query прави всичко:

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

Модел на данни

Може да помислите за промяна на вашия модел на данни към класическа връзка n:m. Ще включва тези таблици и първични ключове:

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

Винаги можете да дефинирате institution_staff.i_id UNIQUE , ако даден потребител може да принадлежи само към една institution .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. org.postgresql.util.PSQLException:ГРЕШКА:релацията app_user не съществува

  2. Функция DATE ADD в PostgreSQL

  3. PostgreSQL:Използването на оператор AND в LEFT JOIN не работи според очакванията

  4. свържете екземпляр на google cloud sql postgres от beam pipeline

  5. Получаване на грешка:Peer удостоверяването е неуспешно за потребител postgres, когато се опитва да накара pgsql да работи с релси