2014-04-08 3 views
5

मेरे पास "myTable" mysql तालिका है जिसमें myTable.id को किसी अन्य तालिका पर किसी विदेशी कुंजी द्वारा संदर्भित किया जाता है। मुझे "myTable" को छोटा करने की जरूरत है। आम तौर पर mysql खोल के साथ मैं करता हूं:नोडजेज़ एक विदेशी कुंजी संदर्भित तालिका को छीनने के लिए अनुक्रमित करते हैं

mysql> SET FOREIGN_KEY_CHECKS = 0; truncate table myTable; SET FOREIGN_KEY_CHECKS = 1; 

क्या अनुक्रमित करने के साथ ऐसा करने का कोई तरीका है?

मैं निष्पादित करने के लिए

sequelize.query('SET FOREIGN_KEY_CHECKS = 0; truncate table myTable; SET FOREIGN_KEY_CHECKS = 1;')

की कोशिश की है, लेकिन मैं त्रुटि है:

ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint 

उत्तर

8
:

`Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'truncate table myTable; SET FOREIGN_KEY_CHECKS = 1' at line 1` 

अगर मैं प्रश्नों क्रमानुसार निष्पादित, मैं मेज काट-छांट नहीं कर सकते हैं

यह हो रहा है, क्योंकि अगलीकरण आपको गुणक निष्पादित करने की अनुमति नहीं देगी ई sequelize.query कॉल के साथ ई प्रश्न। वर्णित परिदृश्य को अभी केवल sequelize.sync({ force: true }) के लिए संभाला जाता है जो सभी तालिकाओं को छोड़ देता है और बाद में उन्हें पुन: प्रयास करता है। विधि आंतरिक रूप से निम्नलिखित कोड का उपयोग कर रहा है:

https://github.com/sequelize/sequelize/blob/a014bd8d172fb8fd9881cee866abfcab842c30fc/lib/query-interface.js#L227-228

यह मूल रूप से हर मेज और चेक लोड करता है अगर वहाँ विदेशी चाबियाँ हैं। यदि ऐसा है, तो अगलीकरण उन्हें अन्य तालिका से पहले छोड़ देगी। आप शायद तर्क को अपना सकते हैं। इसके अलावा: यदि आप उस सामान को लागू करने का निर्णय लेते हैं, तो आप शायद जिथब पर एक पुल अनुरोध खोल सकते हैं। वह मुश्किल चट्टान होगा। एक अन्य विकल्प है जो शायद काम करेगा, निम्नलिखित है:

sequelize.transaction(function(t) { 
    var options = { raw: true, transaction: t } 

    sequelize 
    .query('SET FOREIGN_KEY_CHECKS = 0', null, options) 
    .then(function() { 
     return sequelize.query('truncate table myTable', null, options) 
    }) 
    .then(function() { 
     return sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null, options) 
    }) 
    .then(function() { 
     return t.commit() 
    }) 
}).success(function() { 
    // go on here ... 
}) 

यह काम करता है क्योंकि लेनदेन एक समर्पित कनेक्शन का उपयोग कर रहे हैं, जिसका अर्थ है आप आसानी से एक पंक्ति में आदेश पर अमल कर सकते हैं।

+0

धन्यवाद, मेरी समस्या हल हो गई। – Juanra

+0

तो, दूसरे शब्दों में हमें अपने एफके स्वयं की परवाह करना है क्योंकि Sequelize हर समय बुरी तरह विफल रहता है https://github.com/sequelize/sequelize/issues/6894 – Green

+0

मुझे एक त्रुटि है: 'त्रुटि: Sequelize.query केवल पैरामीटर 'एसक्यूएल' और 'विकल्प' का उपयोग करने के लिए दोबारा प्रतिक्रिया दी गई थी। कृपया बीसी के बारे में चेंजलॉग पढ़ें। –

3

मैं अनुक्रम संस्करण 3.5.1 और sdepolds solution का उपयोग कर रहा हूं अब और काम नहीं करता है क्योंकि अनुक्रमिक एपीआई बदल गया है। उनके समाधान अनुकूल परिणाम होगा:

sequelize.transaction(function(t) { 
    var options = { raw: true, transaction: t } 

    return sequelize 
    .query('SET FOREIGN_KEY_CHECKS = 0', options) 
    .then(function() { 
     return sequelize.query('truncate table myTable', options) 
    }) 
    .then(function() { 
     return sequelize.query('SET FOREIGN_KEY_CHECKS = 1', options) 
    }) 
}).then(function() { 
    // go on here ... 
}) 

Sequelise's documentation को श्रृंखला में पिछले वादा चलाता है लेन-देन के लिए प्रतिबद्ध अनुसार। sdepolds उत्तर में दूसरा पैरामीटर (शून्य) अब और आवश्यकता नहीं है। इसके अलावा sequelize.query तब बाहर के लिए वापस किया जाना चाहिए।

+0

मुझे एक त्रुटि है: 'त्रुटि: अनुक्रमित करें।क्वेरी को केवल पैरामीटर 'एसक्यूएल' और 'विकल्प' का उपयोग करने के लिए दोबारा प्रतिक्रिया दी गई थी। बीसी के बारे में चेंजलॉग पढ़ें। –

3

मैं sequelize 3.24.3 उपयोग कर रहा हूँ और आप

MyTableModel.truncate({ cascade: true }); 

यहाँ कर सकते हैं cascade विकल्प

Only used in conjunction with TRUNCATE. Truncates all tables that have foreign-key references to the named table, or to any tables added to the group due to CASCADE.

+2

काम नहीं करता है। 'SequelizeDatabaseError: ER_TRUNCATE_ILLEGAL_FK: किसी विदेशी कुंजी बाधा में संदर्भित तालिका को छोटा नहीं कर सकता ' – Green

+1

क्या आप एक संगत संस्करण का उपयोग कर रहे हैं? – ThomasThiebaud

+1

'अनुक्रमांक' के साथ काम किया गया: '3.24.3', एफके बाधाओं को 'सेट सेट नल' पर कॉन्फ़िगर किया गया था। – Dr1Ku

1

मैं another question को देखकर यह मिल गया के प्रलेखन है और यह मेरे लिए काम किया v4.13.2

MyTableModel.destroy({ truncate: { cascade: true } }); 
+0

v4.35.0 के साथ मेरे लिए काम किया –

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