আমি কীভাবে এসকিউএল সার্ভারে একটি বিদেশী কী তৈরি করব?


243

এসকিউএল সার্ভারের জন্য আমি কখনই "হ্যান্ড-কোডড" অবজেক্ট ক্রিয়েশন কোডটি পাইনি এবং বিদেশী কী ডিক্লেরেশন এসকিউএল সার্ভার এবং পোস্টগ্রিসের মধ্যে আপাতদৃষ্টিতে পৃথক। এখানে এখন পর্যন্ত আমার স্কয়ার রয়েছে:

drop table exams;
drop table question_bank;
drop table anwser_bank;

create table exams
(
    exam_id uniqueidentifier primary key,
    exam_name varchar(50),
);
create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint question_exam_id foreign key references exams(exam_id)
);
create table anwser_bank
(
    anwser_id           uniqueidentifier primary key,
    anwser_question_id  uniqueidentifier,
    anwser_text         varchar(1024),
    anwser_is_correct   bit
);

আমি যখন ক্যোয়ারী চালাচ্ছি তখন আমি এই ত্রুটিটি পেয়েছি:

এমএসজি 8139, স্তর 16, রাজ্য 0, লাইন 9 বিদেশী কীতে রেফারেন্সিং কলামগুলির সংখ্যা উল্লেখযোগ্য কলাম, টেবিল 'প্রশ্ন_ব্যাঙ্ক' থেকে পৃথক।

আপনি ত্রুটি স্পট করতে পারেন?


2
এফওয়াইআই, আপনার সীমাবদ্ধতার নাম দেওয়ার জন্য সর্বদা সেরা, বিশেষত ব্যবহৃত ওআরএম ব্যবহার করে।
ট্র্যাকার 1

উত্তর:


198
create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint fk_questionbank_exams foreign key (question_exam_id) references exams (exam_id)
);

37
বিদেশী কী সীমাবদ্ধতার নামকরণও এটি সহায়ক হতে পারে। এটি fk লঙ্ঘনের সমস্যা সমাধানের ক্ষেত্রে সহায়তা করে। উদাহরণস্বরূপ: "বিদেশী কী fk_Qestionbank_exams (প্রশ্ন_এক্সাম_আইডি) রেফারেন্স পরীক্ষা (পরীক্ষা_আইডি)"
জন ভ্যাসিলিফ

31
আমি সম্মত হই যে নামকরণের সীমাবদ্ধতা একটি ভাল পরিকল্পনা তবে কমপক্ষে এসকিউএল সার্ভার ২০০৮ আর 2-তে অন্তত লাইনটির বাক্য গঠনটি "সীমাবদ্ধতা fk_questionbank_exams বিদেশী কী (প্রশ্ন_সামিকা_আইডি) রেফারেন্স পরীক্ষা (পরীক্ষা_আইডি)" হতে হবে
জোনাথন সায়েস

5
একটি অতি গুরুত্বপূর্ণ বিষয় লক্ষণীয় যে বিদেশী কী তৈরি করছে তা সূচক তৈরি করে না । এটির সাথে অন্য টেবিলে যোগদানের ফলে অত্যন্ত ধীর অনুসন্ধানের ফলাফল হতে পারে।
রক্লান

কেন এটি আলাদা তা সম্পর্কে আমি নিশ্চিত নই, তবে আমাকে বিদেশি কী (প্রশ্ন_সামিকা_আইডি) পরীক্ষা (পরীক্ষা_আইডি)
টেনমিলস

প্রাথমিক কীটির জন্য কোনও নন নাল লিখতে হবে, বা আমরা যখন কলামটির জন্য প্রাথমিক কী সীমাবদ্ধতা লিখি তখন কি স্পষ্ট হয়, উদাহরণস্বরূপ, আমি একটি কলামকে নল-নাল বাধা থাকার জন্য প্রাথমিক কী হিসাবে চিহ্নিত করতে যথেষ্ট বসেছি বা অবশ্যই আবশ্যক নন নাল নির্দিষ্ট করা হবে, অর্থাত্, স্পষ্টভাবে লিখিত?
গ্যারি 18

326

এবং যদি আপনি কেবল নিজেরাই এই সীমাবদ্ধতা তৈরি করতে চান তবে আপনি ALTER TABLE ব্যবহার করতে পারেন

alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) references MyOtherTable(PKColumn)

আমি ইনলাইন তৈরির জন্য সারা চিপস দ্বারা উল্লিখিত বাক্য গঠনটি সুপারিশ করব না, কেবল তারপরে আমি আমার নিজের প্রতিবন্ধকতার নাম রাখব।


19
আমি জানি এটি পুরানো ... কেবলমাত্র একটি দ্রুত স্থিরকরণ: রেফারেন্সের সঠিক উপায়: রেফারেন্সগুলি মায়োথের টেবিল (মায়োথেরিডম কলাম)
পেড্রো C88

3
মাই টেবিল_মায়ো কলাম_এফকে সেরা নামকরণ অনুশীলন।
শাইজুট

70

আপনি ব্যবহার করে আপনার বিদেশী কী বাধাটির নামও দিতে পারেন:

CONSTRAINT your_name_here FOREIGN KEY (question_exam_id) REFERENCES EXAMS (exam_id)

1
কোনও ওআরএম ব্যবহার করার সময়, বিদেশী টেবিলের একাধিক উল্লেখের সাথে নামকরণের সীমাবদ্ধতা রাখা সহায়ক ... EF4 সহ বৈশিষ্ট্যগুলিতে নামকরণের সীমাবদ্ধতা ব্যবহৃত হয়, যাতে আমি জানতে পারি যে কন্টাক্ট টেবিল এন্ট্রি ক্রেতা, বিক্রয়কারী ইত্যাদির জন্য ছিল
ট্র্যাকার 1

31

আমি আলেকসকিউসের উত্তরটি পছন্দ করি তবে আপনি যখনই কোনও বিদেশী কী বাধা যুক্ত করেন তখন আপনার কিছুটা মনোযোগ দেওয়া উচিত যা আপনি রেফারেন্সযুক্ত সারণির এক সারিতে রেফারেন্সযুক্ত কলামে কীভাবে আপডেট চান এবং বিশেষত আপনি রেফারেন্সে সারিগুলির মোছা কীভাবে চান টেবিল চিকিত্সা করা।

যদি এইরকম কোনও প্রতিবন্ধকতা তৈরি হয়:

alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) 
references MyOtherTable(PKColumn)

.. তারপরে রেফারেন্সিং সারণীতে সম্পর্কিত সারি থাকলে রেফারেন্স সারণিতে আপডেট বা মুছে ফেলা ত্রুটির সাথে ফুটে উঠবে।

এটি আপনার পছন্দসই আচরণ হতে পারে, তবে আমার অভিজ্ঞতায় এটি খুব বেশি সাধারণভাবে হয় না।

আপনি যদি এটির পরিবর্তে এটি তৈরি করেন:

alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) 
references MyOtherTable(PKColumn)
on update cascade 
on delete cascade

..পরে অভিভাবক সারণীতে আপডেটগুলি এবং মুছে ফেলার ফলে রেফারেন্সিং সারণীতে সংশ্লিষ্ট সারিগুলির আপডেট এবং মুছে ফেলা হবে।

(আমি পরামর্শ নই ডিফল্ট সাবধানতা পাশ, যা ভাল পরিবর্তন করা উচিত, ডিফল্ট ভুল। আমি এটা চল কিছু বলছে না যে একজন ব্যক্তি যিনি constaints তৈরি করছে সবসময় বেতন মনোযোগ উচিত ।)

কোনও টেবিল তৈরি করার সময়, এভাবে করা যায়:

create table ProductCategories (
  Id           int identity primary key,
  ProductId    int references Products(Id)
               on update cascade on delete cascade
  CategoryId   int references Categories(Id) 
               on update cascade on delete cascade
)

"টেবিল পরিবর্তন করে MyTable (...)" দিয়ে আরও ভাল কাজ করে। :)
সিলভাইন

14
create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null constraint fk_exam_id foreign key references exams(exam_id),
    question_text varchar(1024) not null,
    question_point_value decimal
);

- এটা খুব কাজ করবে। পেপাস আরও কিছু স্বজ্ঞাত নির্মাণ?


1
এটি আমিই করি তবে আমার একটি প্রশ্ন রয়েছে, "বিদেশী কী" কীওয়ার্ডগুলি যুক্ত করার কোনও বিন্দু আছে? - এটি ছাড়া এটি কাজ করে বলে মনে হচ্ছে, উদাহরণস্বরূপ: প্রশ্ন_একটি পরীক্ষা_ই অনন্য পরিচয়দাতা নাল রেফারেন্স পরীক্ষা (পরীক্ষা_আইডি) নয়
জেসিরিস

"বিদেশী কী" কীওয়ার্ডগুলি alচ্ছিক। আমার মতে এটি কোডটি আরও পঠনযোগ্য করে তোলে।
বিজিমন

8

যে কোনও টেবিলে একটি বিদেশী কী তৈরি করতে

ALTER TABLE [SCHEMA].[TABLENAME] ADD FOREIGN KEY (COLUMNNAME) REFERENCES [TABLENAME](COLUMNNAME)
EXAMPLE
ALTER TABLE [dbo].[UserMaster] ADD FOREIGN KEY (City_Id) REFERENCES [dbo].[CityMaster](City_Id)

8

আপনি যদি কোনও জিজ্ঞাসা ব্যবহার করে সম্পর্কের ক্ষেত্রে দুটি টেবিলের কলাম তৈরি করতে চান তবে নীচের চেষ্টা করুন:

Alter table Foreign_Key_Table_name add constraint 
Foreign_Key_Table_name_Columnname_FK
Foreign Key (Column_name) references 
Another_Table_name(Another_Table_Column_name)

5

আপনার মতো, আমি সাধারণত হাতের দ্বারা বিদেশী কী তৈরি করি না, তবে কোনও কারণে যদি আমার স্ক্রিপ্টের প্রয়োজন হয় তবে আমি সাধারণত এটি এমএস স্কিএল সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করে তৈরি করি এবং তারপরে পরিবর্তনগুলি সংরক্ষণ করার আগে, আমি টেবিল ডিজাইনার নির্বাচন করি | পরিবর্তন স্ক্রিপ্ট উত্পন্ন


4

এই স্ক্রিপ্টটি বিদেশী কী দিয়ে টেবিল তৈরি করার বিষয়ে এবং আমি রেফারেন্সিয়াল অখণ্ডতা সীমাবদ্ধতা স্কেল-সার্ভার যুক্ত করেছি

create table exams
(  
    exam_id int primary key,
    exam_name varchar(50),
);

create table question_bank 
(
    question_id int primary key,
    question_exam_id int not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint question_exam_id_fk
       foreign key references exams(exam_id)
               ON DELETE CASCADE
);

3

Necromancing।
আসলে, এটি সঠিকভাবে করা কিছুটা কৌশলযুক্ত trick

আপনাকে প্রথমে আপনার বিদেশী কীটি উল্লেখ করতে চাইলে কলামটির জন্য প্রাথমিক-কী উপস্থিত রয়েছে কিনা তা পরীক্ষা করা উচিত।

এই উদাহরণস্বরূপ, টেবিলে T_ZO_SYS_Language_ Forms টেবিলের একটি বিদেশী কী তৈরি করা হয়েছে, ডিবিও উল্লেখ করে T_T_SYS_Language_ forms.LANG_UID

-- First, chech if the table exists...
IF 0 < (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'BASE TABLE'
    AND TABLE_SCHEMA = 'dbo'
    AND TABLE_NAME = 'T_SYS_Language_Forms'
)
BEGIN
    -- Check for NULL values in the primary-key column
    IF 0 = (SELECT COUNT(*) FROM T_SYS_Language_Forms WHERE LANG_UID IS NULL)
    BEGIN
        ALTER TABLE T_SYS_Language_Forms ALTER COLUMN LANG_UID uniqueidentifier NOT NULL 

        -- No, don't drop, FK references might already exist...
        -- Drop PK if exists 
        -- ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT pk_constraint_name 
        --DECLARE @pkDropCommand nvarchar(1000) 
        --SET @pkDropCommand = N'ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT ' + QUOTENAME((SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        --WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
        --AND TABLE_SCHEMA = 'dbo' 
        --AND TABLE_NAME = 'T_SYS_Language_Forms' 
        ----AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
        --))
        ---- PRINT @pkDropCommand 
        --EXECUTE(@pkDropCommand) 

        -- Instead do
        -- EXEC sp_rename 'dbo.T_SYS_Language_Forms.PK_T_SYS_Language_Forms1234565', 'PK_T_SYS_Language_Forms';


        -- Check if they keys are unique (it is very possible they might not be) 
        IF 1 >= (SELECT TOP 1 COUNT(*) AS cnt FROM T_SYS_Language_Forms GROUP BY LANG_UID ORDER BY cnt DESC)
        BEGIN

            -- If no Primary key for this table
            IF 0 =  
            (
                SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
                WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
                AND TABLE_SCHEMA = 'dbo' 
                AND TABLE_NAME = 'T_SYS_Language_Forms' 
                -- AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
            )
                ALTER TABLE T_SYS_Language_Forms ADD CONSTRAINT PK_T_SYS_Language_Forms PRIMARY KEY CLUSTERED (LANG_UID ASC)
            ;

            -- Adding foreign key
            IF 0 = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms') 
                ALTER TABLE T_ZO_SYS_Language_Forms WITH NOCHECK ADD CONSTRAINT FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms FOREIGN KEY(ZOLANG_LANG_UID) REFERENCES T_SYS_Language_Forms(LANG_UID); 
        END -- End uniqueness check
        ELSE
            PRINT 'FSCK, this column has duplicate keys, and can thus not be changed to primary key...' 
    END -- End NULL check
    ELSE
        PRINT 'FSCK, need to figure out how to update NULL value(s)...' 
END 

2

আমি সর্বদা 2 টেবিলের মধ্যে বিদেশী কী সীমাবদ্ধতা তৈরি করতে এই বাক্য গঠনটি ব্যবহার করি

Alter Table ForeignKeyTable
Add constraint `ForeignKeyTable_ForeignKeyColumn_FK`
`Foreign key (ForeignKeyColumn)` references `PrimaryKeyTable (PrimaryKeyColumn)`

অর্থাত

Alter Table tblEmployee
Add constraint tblEmployee_DepartmentID_FK
foreign key (DepartmentID) references tblDepartment (ID)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.