2013-06-18 7 views
15

मैं एक MySQL डेटाबेस पर हूं।केवल विदेशी कुंजी ड्रॉप करें यदि यह मौजूद है

मैं यह कर रहा हूं, लेकिन यह काम नहीं करता है।

ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`; 

मैंने जहां भी मैं कर सकता हूं, इस IF EXSTST को रखने की कोशिश की है। यह जांचने से पहले कि विदेशी कुंजी मौजूद है या नहीं?

उत्तर

1

आप किस डाटाबेस का उपयोग कर रहे हैं ??

हैं एसक्यूएल सर्वर

if exists (select 1 from sys.objects where object_id = OBJECT_ID(N'[FKName]') AND  
parent_object_id = OBJECT_ID('TableName')) 
alter table TableName drop constraint FKName 
+0

Am MySQL का उपयोग कर, मैं जहाँ भी मैं कर सकता यह अगर मौजूद है डाल करने के लिए कोशिश की है। यह जांचने से पहले कि विदेशी कुंजी मौजूद है या नहीं? – Creditto

+0

आप कौन सा mysql स्टोरेज इंजन उपयोग कर रहे हैं? MYISAM या INNODB ?? आप सुनिश्चित हैं कि आप MYISAM का उपयोग नहीं कर रहे हैं? –

+0

AM mysql में INNODB स्टोरेज इंजन का उपयोग करके, मैंने इसे कहीं भी स्थापित करने की कोशिश की है जहां भी मैं कर सकता हूं। यह जांचने से पहले कि विदेशी कुंजी मौजूद है या नहीं? – Creditto

7
IF EXISTS(
       SELECT * 
       FROM INFORMATION_SCHEMA.STATISTICS 
       WHERE INDEX_SCHEMA = DATABASE() 
        AND TABLE_NAME='myTable' 
        AND INDEX_NAME = 'myIndex') 
     THEN 

      ALTER TABLE `myTable` DROP FOREIGN KEY `myForeignKey`; 

      ALTER TABLE `myTable` DROP INDEX `myIndex` ; 

     END IF; 

जब आप एक विदेशी कुंजी बाधा बनाने के लिए, mysql स्वचालित रूप से संदर्भित स्तंभ पर एक सूचकांक पैदा करेगा। उपरोक्त उदाहरण से पता चलता है कि INFORMATION_SCHEMA में किसी इंडेक्स की जांच कैसे करें, लेकिन information schema में चेक आउट करने के लिए आपके लिए बहुत अधिक जानकारी है। आपका इंडेक्स नाम इंगित करता है कि यह एक एफके के लिए बनाया गया था, इसलिए आपको पहले एफके छोड़ना होगा, फिर इंडेक्स ड्रॉप करना होगा। यदि आप फिर से विदेशी कुंजी बनाते हैं, तो MySQL फिर से अनुक्रमणिका बनायेगा। टेबल स्कैन किए बिना संदर्भित अखंडता को लागू करने के लिए इसे एक सूचकांक की आवश्यकता होती है।

यदि आपका इरादा एक नया सूचकांक बनाना था जिसमें एक ही कॉलम है, तो आपको पहले उस इंडेक्स को बनाना होगा (इस कॉलम के साथ, जिसे एफके के रूप में उपयोग किया जाएगा, जो सूची में पहला है सूचकांक के लिए निर्दिष्ट कॉलम)। अब आप अपना एफके बैक जोड़ सकते हैं और mysql किसी अन्य को बनाये बिना नई अनुक्रमणिका का उपयोग करने में प्रसन्न होंगे।

संपादित करें: इंडेक्स को तुरंत देखने के लिए myTable से SHOW INDEXES को निष्पादित करें;

16

आप अगर यह मौजूद है और नहीं है प्रक्रियाओं का उपयोग करने के आप इसे इस तरह से कर सकते हैं (MySQL के लिए) चाहते हैं विदेशी कुंजी ड्रॉप करना चाहते हैं:

set @var=if((SELECT true FROM information_schema.TABLE_CONSTRAINTS WHERE 
      CONSTRAINT_SCHEMA = DATABASE() AND 
      TABLE_NAME  = 'table_name' AND 
      CONSTRAINT_NAME = 'fk_name' AND 
      CONSTRAINT_TYPE = 'FOREIGN KEY') = true,'ALTER TABLE table_name 
      drop foreign key fk_name','select 1'); 

prepare stmt from @var; 
execute stmt; 
deallocate prepare stmt; 

अगर कोई विदेशी कुंजी हम तालिका में परिवर्तन कर दिया है परिवर्तनीय में बयान और यदि हम नहीं हैं तो हम एक डमी स्टेटमेंट डालते हैं। और फिर हम इसे निष्पादित करते हैं।

10

अधिक पुन: उपयोगिता के लिए, आप वास्तव में संग्रहीत प्रक्रिया का उपयोग करना चाहते हैं। अपने वांछित डीबी पर एक बार इस कोड को चलाएँ:

DROP PROCEDURE IF EXISTS PROC_DROP_FOREIGN_KEY; 
    DELIMITER $$ 
    CREATE PROCEDURE PROC_DROP_FOREIGN_KEY(IN tableName VARCHAR(64), IN constraintName VARCHAR(64)) 
    BEGIN 
     IF EXISTS(
      SELECT * FROM information_schema.table_constraints 
      WHERE 
       table_schema = DATABASE()  AND 
       table_name  = tableName  AND 
       constraint_name = constraintName AND 
       constraint_type = 'FOREIGN KEY') 
     THEN 
      SET @query = CONCAT('ALTER TABLE ', tableName, ' DROP FOREIGN KEY ', constraintName, ';'); 
      PREPARE stmt FROM @query; 
      EXECUTE stmt; 
      DEALLOCATE PREPARE stmt; 
     END IF; 
    END$$ 
    DELIMITER ; 

इसके बाद, आप हमेशा इस जगह ले सकता है:

ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`; 
इस के साथ

:

CALL PROC_DROP_FOREIGN_KEY('object', 'object_ibfk_1'); 

आपकी स्क्रिप्ट तो आसानी से है कि क्या object_ibfk_1 वास्तव में चलाना चाहिए मौजूद है या नहीं।

की वजह से क्रेडिट का एक बहुत: http://simpcode.blogspot.com.ng/2015/03/mysql-drop-foreign-key-if-exists.html

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