त्रुटियां:
-
RETURNING
दूसरेINSERT
में क्लॉज गायब है बयान। -
अपने दूसरे
INSERT
. के लिए कॉलम की एक स्पष्ट सूची प्रदान करें बयान भी। -
आपूर्ति न करें
NULL
INSERT
में बयान यदि आप चाहते हैं कि कॉलम डिफॉल्ट (सीरियल कॉलम?) शुरू हो जाए। कीवर्डDEFAULT
का उपयोग करें या बस कॉलम का बिल्कुल भी उल्लेख न करें।
बेहतर समाधान:
data-moidifying 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);
यह एक क्वेरी यह सब करती है:
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
. से संबंधित हो सकता है ।