SQL เพิ่มคีย์ต่างประเทศในคอลัมน์ที่มีอยู่


110

ถ้าฉันใช้คำสั่ง SQL ต่อไปนี้ใน SQL Server 2008 เพื่ออัปเดตตารางที่มีข้อ จำกัด ของคีย์ต่างประเทศ:

ALTER TABLE Employees
ADD FOREIGN KEY (UserID)
REFERENCES ActiveDirectories(id)

UserIDเป็นคอลัมน์ FK ของฉันในEmployeesตาราง ฉันพยายามอ้างอิงUserIDในActiveDirectoriesตารางของฉัน ฉันได้รับข้อผิดพลาดนี้:

คีย์ต่างประเทศ 'UserID' อ้างอิงคอลัมน์ที่ไม่ถูกต้อง 'UserID' ในการอ้างอิงตาราง 'พนักงาน'


1
คุณช่วยระบุสคีมาสองตารางของคุณได้ไหม
Stefan H

อ้างอิงลิงค์นี้stackoverflow.com/questions/35196951/…
Jigar Darji

คำตอบ:


191

ข้อผิดพลาดบ่งชี้ว่าไม่มีคอลัมน์ UserID ในตารางพนักงานของคุณ ลองเพิ่มคอลัมน์ก่อนแล้วจึงเรียกใช้คำสั่งอีกครั้ง

ALTER TABLE Employees
ADD CONSTRAINT FK_ActiveDirectories_UserID FOREIGN KEY (UserID)
    REFERENCES ActiveDirectories(id);

ถูกต้องแล้ว ฐานข้อมูลของเราไม่ได้อัปเดตคอลัมน์เพิ่มของเรา สิ่งนี้ได้รับการแก้ไขแล้ว แต่ไม่ใช่ว่าสร้างคอลัมน์ของเราแล้วฉันยังไม่สามารถเพิ่มข้อ จำกัด ได้ There are no primary or candidate keys in the referenced table 'ActiveDirectories' that match the referencing column list in the foreign key 'FK__Employees__UserI__04E4BC85'.
ExceptionLimeCat

ดูเหมือนว่าคอลัมน์ใดก็ตามที่อ้างอิงโดย FK__Employees__UserI__04E4BC85 ไม่ได้กำหนดเป็นคีย์หลักหรือคีย์ตัวเลือกในตาราง ActiveDirectories
BluesRockAddict

ใช่ แต่มันเป็น PK ของเราในตาราง ActiveDirectories
ExceptionLimeCat

1
แก้ไขแล้ว: มีเหตุผลว่าทำไมคุณถึงสร้าง ERD และสร้างความสัมพันธ์ก่อนสร้าง เรามีระเบียนมากเกินไปในตารางเดียวซึ่งทำให้เกิดข้อผิดพลาดในการพยายามสร้างความสัมพันธ์กับตารางอื่น ขอบคุณทุกคน
ExceptionLimeCat

อ้างอิงลิงค์นี้stackoverflow.com/questions/35196951/…
Jigar Darji

19

บางทีคุณอาจมีคอลัมน์ของคุณย้อนหลัง ??

ALTER TABLE Employees
ADD FOREIGN KEY (UserID)           <-- this needs to be a column of the Employees table
REFERENCES ActiveDirectories(id)   <-- this needs to be a column of the ActiveDirectories table

เป็นไปได้ไหมว่าคอลัมน์ถูกเรียกIDในEmployeesตารางและUserIDในActiveDirectoriesตาราง?

จากนั้นคำสั่งของคุณควรเป็น:

ALTER TABLE Employees
ADD FOREIGN KEY (ID)                   <-- column in table "Employees"
REFERENCES ActiveDirectories(UserID)   <-- column in table "ActiveDirectories" 

1
ฉันรู้ว่ามันแปลก แต่น่าเสียดายที่ชื่อในรหัสตาราง ActiveDirectory
ExceptionLimeCat

5

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

ในการอนุญาตให้ตั้งชื่อข้อ จำกัด คีย์ต่างประเทศและสำหรับการกำหนดข้อ จำกัด คีย์ต่างประเทศในหลายคอลัมน์ให้ใช้ไวยากรณ์ SQL ต่อไปนี้:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

1
ALTER TABLE Faculty 
WITH CHECK ADD  CONSTRAINT FKFacultyBook
FOREIGN KEY FacId
REFERENCES Book Book_Id

ALTER TABLE Faculty 
WITH CHECK ADD  CONSTRAINT FKFacultyStudent 
FOREIGN KEY FacId
REFERENCES Student StuId

5
คุณควรให้คำอธิบายพร้อมคำตอบของคุณ
fen1x

0

วิธีการสร้างคีย์ต่างประเทศที่ถูกต้องสำหรับ ActiveDirectories (id) ฉันคิดว่าข้อผิดพลาดหลักคือคุณไม่ได้กล่าวถึงคีย์หลักสำหรับ id ในตาราง ActiveDirectories


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