11

में अपेक्षा के अनुरूप इस प्रकार अगर मैं टेबल a और b को परिभाषित:बाध्यताएं निर्धारित सभी काम नहीं कर टाल PostgreSQL 9.3

CREATE TABLE a(i integer); 
ALTER TABLE a ADD CONSTRAINT pkey_a PRIMARY KEY (i); 
CREATE TABLE b(j integer); 
ALTER TABLE b add CONSTRAINT fkey_ij FOREIGN KEY (j) 
     REFERENCES a (i) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE; 
INSERT INTO a(i) VALUES(1); 

और फिर निम्न कार्य करें:

START TRANSACTION; 
SET CONSTRAINTS ALL DEFERRED; 
INSERT INTO b(j) VALUES(2); 
INSERT INTO a(i) VALUES(2); 
COMMIT; 

यह नीचे त्रुटि पैदा करता है। SET CONSTRAINTS क्यों वांछित प्रभाव नहीं है?

ERROR: insert or update on table "b" violates foreign key constraint "fkey_ij"
SQL state: 23503 Detail: Key (j)=(2) is not present in table "a".

+0

मामलों में जहां आप जैसे हैं, उसके लिए एक वैकल्पिक समाधान बैकअप को पुनर्स्थापित करना ट्रिगर को अक्षम करना होगा। देखें: http://stackoverflow.com/q/3942258/1157054 – Ajedi32

उत्तर

11

शुरुआत के लिए, केवल DEFERRABLE बाधाओं आस्थगित जा सकता है।

लेकिन इससे आपके मामले में मदद नहीं मिलेगी क्योंकि एफके की बाधाओं को पर पर इस तरह से झुकाया नहीं जा सकता है। Per documentation:

Referential actions other than the NO ACTION check cannot be deferred, even if the constraint is declared deferrable.

अपने INSERT बयान के अनुक्रम रिवर्स।

संबंधित:

+1

यदि विदेशी कुंजी बाधाएं 'सेट कन्स्ट्रेंट्स' से प्रभावित नहीं हो सकती हैं, तो फिर 'सेट कन्स्ट्रेंट्स' राज्य के लिए दस्तावेज़ क्यों करें: "वर्तमान में, केवल अद्वितीय, प्राथमिक कुंजी, ** संदर्भ (विदेशी कुंजी) **, और इस सेटिंग से EXCLUDE बाधाएं प्रभावित हैं "? http://www.postgresql.org/docs/current/static/sql-set-constraints.html – Ajedi32

+1

कभी नहीं, इसे समझ लिया। वे प्रभावित हो सकते हैं, लेकिन केवल तभी यदि आप 'अद्यतन पर' या 'हटाए गए कार्यों' का उपयोग नहीं कर रहे हैं, जो इस मामले में ओपी है। – Ajedi32

संबंधित मुद्दे