यहां MS DOCS पढ़ने के बाद ।
एक विदेशी कुंजी को संशोधित करने के लिए
Transact-SQL का उपयोग करके एक FOREIGN कुंजी बाधा को संशोधित करने के लिए, आपको पहले मौजूदा FOREIGN कुंजी बाधा को हटाना होगा और फिर इसे नई परिभाषा के साथ बनाना होगा। अधिक जानकारी के लिए, विदेशी कुंजी संबंध हटाएँ और विदेशी कुंजी संबंध बनाएँ देखें।
आपके मामले में मेरा मानना है कि एक नया FK जोड़ें और पुराने को हटा दें। स्कैन को अक्षम करने के लिए आप NO CHECK
विकल्प का उपयोग कर सकते हैं
--DROP TABLE T2
--DROP TABLE T1
CREATE TABLE T1 (
[Id] INT,
[NAME] varchar(100), CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED (id))
CREATE TABLE T2 (
t2_id int,
T1_Id INT NOT NULL
,CONSTRAINT [FK_T2_T1] FOREIGN KEY (T1_Id) REFERENCES T1(Id)
)
CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)
select
ix.index_id,
ix.name as index_name,
ix.type_desc as index_type_desc,
fk.name as fk_name
from sys.indexes ix
left join sys.foreign_keys fk on
fk.referenced_object_id = ix.object_id
and fk.key_index_id = ix.index_id
and fk.parent_object_id = object_id('T2')
where ix.object_id = object_id('T1');
╔══════════╦════════════╦═════════════════╦══════════╗
║ index_id ║ index_name ║ index_type_desc ║ fk_name ║
╠══════════╬════════════╬═════════════════╬══════════╣
║ 1 ║ PK_T1 ║ CLUSTERED ║ FK_T2_T1 ║
║ 2 ║ IX_T1_Id ║ NONCLUSTERED ║ NULL ║
╚══════════╩════════════╩═════════════════╩══════════╝
ALTER TABLE T2
WITH NOCHECK
ADD CONSTRAINT [FK_T2_T1_NEW] FOREIGN KEY(T1_Id)
REFERENCES T1(Id)
select
ix.index_id,
ix.name as index_name,
ix.type_desc as index_type_desc,
fk.name as fk_name
from sys.indexes ix
left join sys.foreign_keys fk on
fk.referenced_object_id = ix.object_id
and fk.key_index_id = ix.index_id
and fk.parent_object_id = object_id('T2')
where ix.object_id = object_id('T1');
╔══════════╦════════════╦═════════════════╦══════════════╗
║ index_id ║ index_name ║ index_type_desc ║ fk_name ║
╠══════════╬════════════╬═════════════════╬══════════════╣
║ 1 ║ PK_T1 ║ CLUSTERED ║ FK_T2_T1 ║
║ 2 ║ IX_T1_Id ║ NONCLUSTERED ║ FK_T2_T1_NEW ║
╚══════════╩════════════╩═════════════════╩══════════════╝
ALTER TABLE T2
DROP CONSTRAINT FK_T2_T1
select
ix.index_id,
ix.name as index_name,
ix.type_desc as index_type_desc,
fk.name as fk_name
from sys.indexes ix
left join sys.foreign_keys fk on
fk.referenced_object_id = ix.object_id
and fk.key_index_id = ix.index_id
and fk.parent_object_id = object_id('T2')
where ix.object_id = object_id('T1');
╔══════════╦════════════╦═════════════════╦══════════════╗
║ index_id ║ index_name ║ index_type_desc ║ fk_name ║
╠══════════╬════════════╬═════════════════╬══════════════╣
║ 1 ║ PK_T1 ║ CLUSTERED ║ NULL ║
║ 2 ║ IX_T1_Id ║ NONCLUSTERED ║ FK_T2_T1_NEW ║
╚══════════╩════════════╩═════════════════╩══════════════╝
यह देखें कि क्या यह काम करता है, मैं जो कोशिश कर रहा हूं वह एक और एफके को जोड़ना है ताकि नया बनाया गया नए सूचकांक से जुड़ा हो और पुराने केके को छोड़ दें। मुझे पता है कि सवाल मौजूदा को छोड़ने का नहीं है, लेकिन देखें कि क्या यह विकल्प आपकी मदद करेगा।
इसके अलावा, मैक्स वर्नोन की टिप्पणियों के अनुसार: "विद एनओएचईसीएचके विकल्प विदेशी कुंजी को ऑप्टिमाइज़र द्वारा भरोसेमंद होने से रोकेगा। कुछ बिंदु पर, आपको विदेशी कुंजी को बदलना होगा ताकि यह विश्वसनीय तालिका का उपयोग करके विश्वसनीय हो ... चेक के साथ "
NOCHECK
केवल निर्माण के समय ध्यान नहीं दिया जाएगा लेकिन अखंडता contraint लागू करने के लिए आप समय के कुछ बिंदु पर यह समाप्त हो गया है।