2012-09-19 14 views
46

मैं किसी अन्य तालिका से विदेशी कुंजी को हटाना चाहता हूं ताकि मैं अपनी पसंद के मूल्यों को सम्मिलित कर सकूं।एसक्यूएल सर्वर में विदेशी कुंजी बाधा को कैसे हटाया जाए?

मैं डेटाबेस में नया हूं इसलिए कृपया मुझे विदेशी कुंजी मान को छोड़ने या निकालने के लिए सही एसक्यूएल क्वेरी बताएं।

+21

यदि आप डेटाबेस के लिए नए हैं, तो आप पहली बार प्रतिक्रिया करते हैं जब विदेशी कुंजी उल्लंघन का सामना करना पड़ता है, यह नहीं सोचना चाहिए कि "मैं विदेशी कुंजी छोड़ दूंगा"। –

+2

संभावित डुप्लिकेट [मैं SQL सर्वर में एक विदेशी कुंजी कैसे छोड़ूं?] (Http://stackoverflow.com/questions/93264/how-do-i-drop-a-foreign-key-in-sql-server) – Liam

उत्तर

96

निम्न प्रयास

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME> 

देखें: http://www.w3schools.com/sql/sql_foreignkey.asp

+1

मैंने कोई बाधा नाम नहीं जोड़ा है। मैं उस बाधा को कैसे हटा सकता हूं? –

+1

भले ही आप बाधा नाम निर्दिष्ट नहीं करते हैं SQL सर्वर एक अद्वितीय बाधा नाम असाइन करेगा। आप एसक्यूएल प्रबंधन स्टूडियो के साथ नाम पा सकते हैं। –

+0

पोस्टग्रेस कमांड लाइन क्लाइंट में \ d table_name टाइप करके, आप निश्चित रूप से बाधा का नाम भी पा सकते हैं। आमतौर पर "एफके ......." – Nytux

11

referential integrity के संदर्भ में ऐसा करना गलत है, क्योंकि एक बार जब यह टूट जाता है तो रिकॉर्ड को पार किए बिना इसे बाधाओं को तोड़ने और बाधाओं को तोड़ने के बिना इसे फिर से चालू करना आसान नहीं होता है।

वैसे भी सिंटेक्स इस प्रकार है:

ALTER TABLE Tablename DROP CONSTRAINT ContName; 

देखें MSDN:

+0

नहीं, विदेशी कुंजी और प्राथमिक कुंजी छोड़ने के लिए SQL सर्वर में सिंटैक्स समान है: तालिका ड्रॉप बाधा demoncodemonkey

1
ALTER TABLE table 
DROP FOREIGN KEY fk_key 

संपादित करें: नोटिस नहीं किया था आप उसी थे एनजी एसक्यूएल सर्वर, मेरा बुरा

ALTER TABLE table 
DROP CONSTRAINT fk_key 
+0

मैं SQL सर्वर का उपयोग कर रहा हूं। –

+0

इसलिए मैंने देखा :) – mokuril

4
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME] 

लेकिन, हो सकता है सावधान आदमी, एक बार आप ऐसा करते हैं, आप एक मौका वापस कभी नहीं मिल सकता है, और आप कुछ बुनियादी डेटाबेस किताब पढ़ना चाहिए देखने के कारण है कि हम विदेशी कुंजी की आवश्यकता

+1

वह फिर से बाधा डाल सकता है अगर वह इसे वापस चाहता है, जब तक कि रेफरेंसियल अखंडता अभी भी वहां है। यदि ऐसा नहीं है, तो उसे वैसे भी तय किया जाना है। – Tobberoth

+0

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

4

निकालने के लिए सभी डीबी से कमी:

SELECT 'ALTER TABLE ' + Table_Name +' DROP CONSTRAINT ' + Constraint_Name 
FROM Information_Schema.CONSTRAINT_TABLE_USAGE 
0

उपयोग उन प्रश्नों सभी FKS लगता है:

Declare @SchemaName VarChar(200) = 'Schema Name' 
Declare @TableName VarChar(200) = 'Table name' 

-- Find FK in This table. 
SELECT 
    'IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
     + ''') AND parent_object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' 
     + OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' + 

    'ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + 
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name 
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id) 
FROM sys.foreign_keys AS FK 
INNER JOIN Sys.objects As O 
    ON (O.object_id = FK.parent_object_id) 
INNER JOIN SYS.schemas AS S 
    ON (O.schema_id = S.schema_id) 
WHERE 
     O.name = @TableName 
     And S.name = @SchemaName 


-- Find the FKs in the tables in which this table is used 
    SELECT 
    ' IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
     + ''') AND parent_object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' 
     + OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' + 

    ' ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + 
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name 
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id) 
FROM sys.foreign_keys AS FK 
INNER JOIN Sys.objects As O 
    ON (O.object_id = FK.referenced_object_id) 
INNER JOIN SYS.schemas AS S 
    ON (O.schema_id = S.schema_id) 
WHERE 
     O.name = @TableName 
     And S.name = @SchemaName 
0

आप पर विचार करना चाहिए (अस्थायी) बाधा अक्षम करने से पहले आप पूरी तरह से इसे हटा दें।

आप तालिका बनाने TSQL को देखें, तो आप की तरह कुछ देखेंगे:

ALTER TABLE [dbo].[dbAccounting] CHECK CONSTRAINT [FK_some_FK_constraint] 

आप

ALTER TABLE [dbo].[dbAccounting] NOCHECK CONSTRAINT [FK_some_FK_constraint] 

चला सकते हैं ... तो डालने/मानों बाधा का उल्लंघन के एक झुंड को अद्यतन , और फिर इसे मूल CHECK कथन चलाकर इसे चालू करें।

-3
alter table <referenced_table_name> drop primary key; 

विदेशी कुंजी बाधा हटा दिया जाएगा (मैं खराब तरीके से तैयार सिस्टम मैंने पहले भी विरासत में मिला लिया है सफाई करने के लिए यह करने के लिए किया है।)।

+0

संदर्भित तालिका की प्राथमिक कुंजी को छोड़ना शायद समस्या को ठीक करने का प्रयास करने का सबसे खराब तरीका है। ओह रुको - संदर्भित तालिका को छोड़ना खुद खराब हो सकता है। – brewmanz

0

वैकल्पिक रूप से, आप SQL सर्वर प्रबंधन स्टूडियो से ही एक विदेशी कुंजी प्रतिबंध हटा सकते हैं। यदि आदेश काम नहीं करते हैं तो आप इसे आजमा सकते हैं।

  1. अपने डेटाबेस दृश्य का विस्तार करें।
  2. तालिका पर राइट क्लिक करें जिसमें विदेशी कुंजी बाधा है। डिजाइन चुनें। तालिका कॉलम के बारे में जानकारी वाला एक टैब खुल जाएगा।
  3. उस कॉलम पर राइट क्लिक करें जिसमें विदेशी कुंजी संदर्भ है। या आप किसी भी कॉलम पर राइट क्लिक कर सकते हैं। रिलेशनशिप चुनें।
  4. पॉप-अप विंडो में संबंधों की एक सूची दिखाई देगी (यदि आपके पास कोई है)।
  5. वहां से आप विदेशी कुंजी बाधा को हटा सकते हैं।

मुझे आशा है कि मदद करता है

0

डीबी तुम वहाँ एक वाक्य रचना या किसी अन्य का उपयोग कर रहे हैं पर निर्भर करता है।

आप ओरेकल उपयोग कर रहे हैं आप क्या अन्य उपयोगकर्ताओं तुमसे कहा था डाल करने के लिए है:

ALTER TABLE table_name DROP CONSTRAINT fk_name; 

लेकिन अगर आप MySQL का उपयोग तो यह आपके एक सिंटैक्स त्रुटि दे देंगे, बजाय आप टाइप कर सकते हैं :

ALTER TABLE table_name DROP INDEX fk_name; 
1

ड्रॉप एक मेज के सभी विदेशी कुंजी:

USE [Database_Name] 
DECLARE @FOREIGN_KEY_NAME VARCHAR(100) 

DECLARE FOREIGN_KEY_CURSOR CURSOR FOR 
SELECT name FOREIGN_KEY_NAME FROM sys.foreign_keys WHERE parent_object_id = (SELECT object_id FROM sys.objects WHERE name = 'Table_Name' AND TYPE = 'U') 

OPEN FOREIGN_KEY_CURSOR 
---------------------------------------------------------- 
FETCH NEXT FROM FOREIGN_KEY_CURSOR INTO @FOREIGN_KEY_NAME 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE @DROP_COMMAND NVARCHAR(150) = 'ALTER TABLE Table_Name DROP CONSTRAINT' + ' ' + @FOREIGN_KEY_NAME 

     EXECUTE Sp_executesql @DROP_COMMAND 

     FETCH NEXT FROM FOREIGN_KEY_CURSOR INTO @FOREIGN_KEY_NAME 

    END 
----------------------------------------------------------------------------------------------------------------- 
CLOSE FOREIGN_KEY_CURSOR 
DEALLOCATE FOREIGN_KEY_CURSOR 
संबंधित मुद्दे