ฉันจะวาง foreign key ใน SQL Server ได้อย่างไร


201

ฉันสร้างคีย์ต่างประเทศ (ใน SQL Server) โดย:

alter table company add CountryID varchar(3);
alter table company add constraint Company_CountryID_FK foreign key(CountryID) 
references Country;

ฉันเรียกใช้แบบสอบถามนี้:

alter table company drop column CountryID;

และฉันได้รับข้อผิดพลาดนี้:

เกี่ยวกับข่าวสาร 5074 ระดับ 16 สถานะ 4 บรรทัด 2
วัตถุ 'Company_CountryID_FK' ขึ้นอยู่กับคอลัมน์ 'CountryID'
เกี่ยวกับข่าวสาร 4922 ระดับ 16 สถานะ 9 บรรทัด 2
เปลี่ยนแปลงตาราง DROP COLUMN CountryID ล้มเหลวเนื่องจากวัตถุหนึ่งรายการขึ้นไปเข้าถึงคอลัมน์นี้

ฉันได้ลองสิ่งนี้แล้ว แต่ดูเหมือนว่ามันจะไม่ทำงาน:

alter table company drop foreign key Company_CountryID_FK; 
alter table company drop column CountryID;

ฉันต้องทำอย่างไรเพื่อวางCountryIDคอลัมน์

ขอบคุณ


2
คุณพยายามวางรหัสต่างประเทศผิดพลาดอย่างไร
ddc0660

2
เพิ่งทราบว่ามันเป็นอันตรายที่จะลดข้อ จำกัด ของคีย์ต่างประเทศโดยไม่ทราบว่าทำไมมันถึงมีอยู่ในที่แรก หากคุณเพิ่งสร้างสิ่งนี้และทำมันโดยไม่ได้ตั้งใจให้ใช้รหัสที่ให้ไว้ในคำตอบอื่น ๆ ถ้าไม่เช่นนั้นอย่าทำข้อ จำกัด จนกว่าคุณจะแน่ใจว่าคุณจะไม่ทำผิดอย่างอื่น ข้อ จำกัด ถูกสร้างขึ้นเพื่อบังคับใช้กฎความวุ่นวายและมันจะดีกว่าที่จะมั่นใจว่าพวกเขาไม่ต้องการอีกต่อไปก่อนที่จะวางพวกเขา
HLGEM


ไวยากรณ์ของคุณสำหรับการวาง FK ไม่จำเป็นต้องใช้คำว่า "foreign key" นี่คือไวยากรณ์สำหรับ MySQL ไม่ใช่ SQL Server คุณสามารถแทนที่ด้วยคำว่า "ข้อ จำกัด "
John Gilmer

คำตอบ:




23

ฉันคิดว่านี่จะเป็นประโยชน์กับคุณ ...

DECLARE @ConstraintName nvarchar(200)
SELECT 
    @ConstraintName = KCU.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
    ON KCU.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG  
    AND KCU.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA 
    AND KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
WHERE
    KCU.TABLE_NAME = 'TABLE_NAME' AND
    KCU.COLUMN_NAME = 'TABLE_COLUMN_NAME'
IF @ConstraintName IS NOT NULL EXEC('alter table TABLE_NAME drop  CONSTRAINT ' + @ConstraintName)

มันจะลบข้อ จำกัด คีย์ต่างประเทศตามตารางและคอลัมน์ที่เฉพาะเจาะจง


2
ขอบคุณกลั้วคอ ลักษณะทั่วไปที่ยอดเยี่ยม
kuklei

19

ตรวจสอบการมีอยู่ของข้อ จำกัด ก่อนจากนั้นจึงปล่อยมัน

if exists (select 1 from sys.objects where name = 'Company_CountryID_FK' and type='F')
begin
alter table company drop constraint  Company_CountryID_FK
end



1

นอกจากนี้คุณยังสามารถคลิกขวาบนตารางเลือกแก้ไขจากนั้นไปที่แอททริบิวคลิกขวาที่มันและเลือกวางคีย์หลัก


1

คุณพยายามที่จะวางข้อ จำกัด FK หรือคอลัมน์ตัวเอง?

หากต้องการวางข้อ จำกัด :

alter table company drop constraint Company_CountryID_FK

คุณจะไม่สามารถวางคอลัมน์จนกว่าคุณจะลดข้อ จำกัด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.