PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Kesalahan logika fitur PHP/MySQL INSERT

Kesalahan:

  • RETURNING klausa tidak ada di INSERT second kedua pernyataan.

  • Berikan daftar kolom eksplisit untuk INSERT kedua Anda pernyataan juga.

  • Jangan berikan NULL di INSERT pernyataan jika Anda ingin kolom default (kolom serial?) digunakan. Gunakan kata kunci DEFAULT atau jangan sebut kolom sama sekali.

Solusi yang lebih baik:

Gunakan CTE pengubah data , tersedia sejak PostgreSQL 9.1 untuk melakukan semuanya dalam satu pernyataan dan menghemat biaya overhead dan perjalanan pulang pergi ke server. (MySQL tidak tahu apa-apa tentang hal itu, bahkan CTE biasa).

Juga, lewati UPDATE dengan memodelkan kembali logika. Ambil satu id dengan nextval() , dan selesaikan hanya dengan dua INSERT pernyataan.

Dengan asumsi model data ini (Anda seharusnya memberikannya dalam pertanyaan Anda):

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

ini kueri melakukan semuanya:

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

Model data

Anda mungkin berpikir untuk mengubah model data Anda ke hubungan n:m klasik.Akan menyertakan tabel dan kunci utama berikut:

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

Anda selalu dapat menentukan institution_staff.i_id UNIQUE , jika pengguna hanya dapat menjadi anggota satu 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. Bagaimana cara menghapus baris duplikat dengan dependensi kunci asing?

  2. Psycopg2 tidak suka nama tabel yang dimulai dengan huruf kecil

  3. PostgreSQL- Filter rentang tanggal

  4. Cara membuat Postgres Copy mengabaikan baris pertama file txt besar

  5. Hibernate, Postgresql:Kolom x bertipe oid tetapi ekspresi bertipe byte