मेरी MySQL तालिका से बाधाओं को कैसे दूर करें?


252

मैं अपनी मेज से अड़चनें दूर करना चाहता हूं। मेरी क्वेरी है:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

लेकिन मुझे एक त्रुटि मिली:

#1064- आपके SQL सिंटैक्स में कोई त्रुटि है; FK_tbl_magazine_issue_mst_usersलाइन 1 पर 'बाधा ' के पास उपयोग करने के लिए सही सिंटैक्स के लिए अपने MySQL सर्वर संस्करण से मेल खाती पुस्तिका की जाँच करें


1
यह ध्यान देने योग्य है कि यदि आपने एक CHECKबाधा बनाई है , तो इसे छोड़ने की कोई आवश्यकता नहीं है क्योंकि कोई वास्तविक बाधा नहीं बनती है। आप information_schema.table_constraintsसत्यापन से चुन सकते हैं, और आप add constraintबिना किसी त्रुटि के भी बार-बार चला सकते हैं । MySQL CHECKबाधाओं का समर्थन नहीं करता है, लेकिन SQL को उन्हें बनाने का इरादा रखता है (वास्तव में बाधाओं को बनाए बिना)।
ADTC



आपका सिंटैक्स पूरी तरह से मान्य है और अब यह समर्थित डेमो है
लुकाज़ स्ज़ोज़ा

जवाबों:


423

विदेशी प्रमुख बाधाओं को दूर करने के लिए मैसूर के पास एक विशेष वाक्यविन्यास है:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

21
Postgres, MSSQL और Oracle सभी हैं alter table .. drop constraint। MySQL एक अजीब है, ऐसा लगता है।
जारेड बेक

यह कहता है कि यह "कॉलम 2" को नहीं गिरा सकता है क्योंकि यह एक विदेशी कुंजी बाधा में आवश्यक है। जब आप कहते हैं कि मैं "कैंट ड्रोप कॉलम 2" प्राप्त करता हूं, तो उस कॉलम / कुंजी की जांच करें "
Lealo

ठीक है, मुझे यह मिल गया है, विदेशी एक अलग चीज है जो स्तंभ को अन्य तालिकाओं से जोड़ता है। मेरा एक मानक नाम दिया गया था। इसके अलावा अब मैं अब आप स्तंभ के बिना विदेशी कुंजी को सुरक्षित रूप से गिरा सकते हैं
लीलो

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

55

मुझे भी यही समस्या थी और मुझे इस कोड के साथ हल करना पड़ा:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;

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

3
एक ही आदेश के रूप में:ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
फ्रैंक फोर्ट

26

DROP CONSTRAINTMySQL में ऐसा कुछ नहीं है । आपके मामले में आप DROP FOREIGN KEYइसके बजाय उपयोग कर सकते हैं ।


12

यदि बाधा एक विदेशी कुंजी नहीं है, उदाहरण के लिए। एक 'UNIQUE CONSTRAINT (colA, colB)' का उपयोग करके जोड़ा गया तो यह एक सूचकांक है जिसे उपयोग करके छोड़ा जा सकता हैALTER TABLE ... DROP INDEX ...


9

यह भी अच्छा है, आप mysql डेटाबेस से सभी विदेशी कुंजी जांचों को अस्थायी रूप से अक्षम कर सकते हैं: SET FOREIGN_KEY_CHECKS=0; और इसे फिर से सक्षम करने के लिए: SET FOREIGN_KEY_CHECKS=1;


8

रॉबर्ट नाइट के उत्तर में थोड़ा सा जोड़ने के लिए, क्योंकि पोस्ट के शीर्षक में ही विदेशी कुंजियों का उल्लेख नहीं है (और क्योंकि उसके पास पूर्ण कोड नमूने नहीं हैं और चूंकि एसओ के टिप्पणी कोड ब्लॉक के साथ-साथ उत्तर के कोड नहीं दिखाते हैं। ब्लॉक), मैं इसे अद्वितीय बाधाओं के लिए जोड़ूंगा। बाधा को गिराने के लिए इनमें से कोई भी काम:

ALTER TABLE `table_name` DROP KEY `uc_name`;

या

ALTER TABLE `table_name` DROP INDEX `uc_name`;

4

कुछ ओआरएम या फ्रेमवर्क डिफ़ॉल्ट की तुलना में विदेशी कुंजी के लिए एक अलग नामकरण सम्मेलन का उपयोग करते हैं FK_[parent table]_[referenced table]_[referencing field], क्योंकि उन्हें बदल दिया जा सकता है।

उदाहरण के लिए लारवेल [parent table]_[referencing field]_foreignनामकरण सम्मेलन के रूप में उपयोग करता है । आप इस क्वेरी का उपयोग करके विदेशी कुंजी के नाम दिखा सकते हैं, जैसा कि यहाँ दिखाया गया है :

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';

फिर पहले बताई गई DROP FOREIGN KEY क्वेरी और उसके उचित नाम को चलाकर विदेशी कुंजी को हटा दें।


2

मारियाडीबी का उपयोग करके यहां आने वालों के लिए:

ध्यान दें कि MariaDB सामान्य तौर पर चेक अवरोधों को छोड़ने के लिए DROP CONSTRAINT कथनों की अनुमति देती है:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

https://mariadb.com/kb/en/library/alter-table/


हां, यह उन बाधाओं के लिए है जो एक ही तालिका में हैं, उदाहरण के लिए CONSTRAINT CHECK(a > b)। विदेशी प्रमुख बाधाओं के लिए, ऐसा लगता है कि आपको अभी भी DROP FOREIGN KEYवाक्यविन्यास की आवश्यकता है , कम से कम मारियाबीडी संस्करण 10.2 में
फ्रैंक फोर्ट

1
  1. तालिका के संरचना दृश्य पर जाएं
  2. आपको शीर्ष पर 2 विकल्प दिखाई देंगे। संबंध देखने का भाव
  3. अब Relation view पर क्लिक करें , यहां आप अपनी विदेशी कुंजी बाधा को छोड़ सकते हैं। आपको यहां सभी संबंध मिल जाएंगे।

यह बहुत अच्छा है, मेरे लिए काम किया जब आप आईडी
सिल्वु सेंट

0

DROP CONSTRAINTMySql में कोई नहीं है । यह mysql 5.7 में जादू की तरह काम करता है

ALTER TABLE answer DROP KEY const_name;

0

बाधा हटाने का सबसे सरल तरीका MySQL 8.0.19ALTER TABLE tbl_name DROP CONSTRAINT symbol; में प्रस्तुत सिंटैक्स का उपयोग करना है :

MySQL 8.0.19 के अनुसार, ALTER TABLE किसी भी प्रकार के मौजूदा अवरोधों को छोड़ने और बदलने के लिए अधिक सामान्य (और SQL मानक) सिंटैक्स की अनुमति देता है, जहां बाधा नाम बाधा से निर्धारित होता है।

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> फिडेल डेमो


-4

यह बाधाओं को छोड़ने के लिए MySQL पर काम करेगा

alter table tablename drop primary key;

alter table tablename drop foreign key;

DROP PRIMARY KEYकाम नहीं करना चाहिए। DROP FOREIGN KEYकाम करता है, लेकिन आप जिसका को निर्दिष्ट करने की आवश्यकता drop। उदाहरण के लिएALTER TABLE tablename DROP FOREIGN KEY id_name_fk
रूसो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.