sql >> Databáze >  >> RDS >> PostgreSQL

Chyba logiky funkce PHP/MySQL INSERT

Chyby:

  • RETURNING ve druhém INSERT chybí klauzule prohlášení.

  • Zadejte explicitní seznam sloupců pro druhý INSERT také prohlášení.

  • Nezadávejte NULL v INSERT prohlášení pokud chcete, aby se aktivovalo výchozí nastavení sloupce (sériové sloupce?). Použijte klíčové slovo DEFAULT nebo tento sloupec vůbec nezmiňujte.

Lepší řešení:

Použijte data-moidifying CTE , dostupný od PostgreSQL 9.1, aby to vše udělal v jednom příkazu a ušetřil režii a zpáteční cesty na server. (MySQL nic takového nezná, dokonce ani obyčejné CTE).

Také přeskočte UPDATE přemodelováním logiky. Získejte jedno ID pomocí nextval() a vystačíte si s pouhými dvěma INSERT prohlášení.

Za předpokladu tohoto datového modelu (měli jste jej uvést ve své otázce):

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

Tento jeden dotaz dělá vše:

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

Datový model

Můžete uvažovat o změně datového modelu na klasický vztah n:m. Zahrnuje tyto tabulky a primární klíče:

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

Vždy můžete definovat institution_staff.i_id UNIQUE , pokud uživatel může patřit pouze do jedné institution .




  1. Více příkazů SELECT CASE v Query For Shoretel Reports

  2. SQL:AKTUALIZACE z komplexního výběru

  3. Zdroj SSIS OLE DB náhodně chybí řádky ze zdroje dat Oracle

  4. Jak získám PHP, aby pracovalo s ADOdb a MySQL?