คำสั่ง INSERT ขัดแย้งกับข้อ จำกัด KEY ต่างประเทศ - SQL Server


225

ฉันได้รับข้อผิดพลาดดังต่อไปนี้ คุณจะกรุณาช่วยฉันหน่อยได้ไหม?

ข่าวสารเกี่ยวกับ 547 ระดับ 16 สถานะ 0 บรรทัด 1
คำสั่ง INSERT ขัดแย้งกับข้อ จำกัด ของคีย์ต่างประเทศ "FK_Sup_Item_Sup_Item_Cat" ความขัดแย้งเกิดขึ้นในฐานข้อมูล "dev_bo", ตาราง "dbo.Sup_Item_Cat" คำสั่งถูกยกเลิก

รหัส:

insert into sup_item (supplier_id, sup_item_id, name, sup_item_cat_id, 
                      status_code, last_modified_user_id, last_modified_timestamp, client_id)   
values (10162425, 10, 'jaiso', '123123',
        'a', '12', '2010-12-12', '1062425')

คอลัมน์สุดท้ายclient_idทำให้เกิดข้อผิดพลาด ฉันพยายามใส่ค่าที่มีอยู่แล้วในdbo.Sup_Item_Catคอลัมน์ให้สอดคล้องกับ sup_item .. แต่ไม่มีความสุข :-(


20
คุณพยายามแทรกระเบียนลงในตารางรายการของคุณที่ไม่มีระเบียนหมวดหมู่ที่ตรงกันในSup_Item_Catตารางของคุณ ไม่มากที่จะพูดเกี่ยวกับมัน
Martin Smith

1
ดังนั้นคุณกำลังบอกว่าSELECT * FROM Sup_Item_Cat WHERE sup_item_cat_id = '123123'ผลตอบแทน?
Martin Smith

2
นอกจากนี้คุณยังพูดว่า "coulum ล่าสุด" client_id "ฉันได้รับความขัดแย้ง" นี่ไม่ใช่สิ่งที่ข้อความแสดงข้อผิดพลาดบอกเป็นนัยว่าฉันคิดว่าคุณกำลังมองหาที่ที่ผิดสำหรับปัญหาของคุณ
Martin Smith

คำตอบ:


287

ในตารางของคุณdbo.Sup_Item_Catมีการอ้างอิงคีย์ต่างประเทศไปยังตารางอื่น วิธีที่ FK ทำงานคือไม่สามารถมีค่าในคอลัมน์นั้นที่ไม่ได้อยู่ในคอลัมน์คีย์หลักของตารางที่อ้างอิงได้

หากคุณมี Studio จัดการเซิร์ฟเวอร์ SQL ให้เปิดขึ้นและsp_help' dbo.Sup_Item_Cat' ดูว่าคอลัมน์ใดที่ FK เปิดอยู่และคอลัมน์ใดของตารางที่อ้างอิง คุณกำลังแทรกข้อมูลที่ไม่ดีบางอย่าง

แจ้งให้เราทราบหากคุณต้องการคำอธิบายที่ดีกว่านี้!


10
ขอบคุณที่รวมคำสั่ง sp_help! ช่วยให้ฉันแคบลงปัญหาที่คล้ายกันของฉัน
Gaʀʀʏ

แน่นอน - ในกรณีของฉันคุณสมบัติไม่ได้ถูกส่งกลับจากมุมมองไปยังตัวควบคุมดังนั้นจึงเป็น 0 เสมอ (ซึ่งไม่ใช่รหัสที่ถูกต้อง แต่ตัวควบคุมจะไม่มีทางรู้ได้)
neminem

1
Alt + F1 เป็นช็อตคัตสำหรับ sp_help สำหรับผู้อ่านที่ชอบอนาคตให้เลือกตารางและกด alt + f1
satsvelke

133

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

แม้จะมีคำตอบที่ตรวจสอบว่าถูกต้อง:

Mike M wrote-

"วิธีการทำงานของ FK คือไม่สามารถมีค่าในคอลัมน์นั้นที่ไม่ได้อยู่ในคอลัมน์คีย์หลักของตารางที่อ้างอิงได้"

สิ่งที่ขาดหายไปจากคำตอบนี้ก็คือ

คุณต้องสร้างตารางที่มีคีย์หลักก่อน

อีกวิธีที่จะบอกว่ามันคือ;

คุณต้องแทรกข้อมูลลงในตารางหลักที่มีคีย์หลักก่อนที่จะพยายามแทรกข้อมูลลงในตารางลูกที่มีคีย์ต่างประเทศ

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

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


และฉันจะเพิ่มตรวจสอบให้แน่ใจว่าโปรไฟล์แบบสอบถามของคุณเพราะมันไม่ได้ส่งสิ่งที่คุณคิดว่ามันควรจะเป็นฐานข้อมูล
HLGEM

20

คุณกำลังพยายามแทรกระเบียนด้วยค่าในคอลัมน์ foreign key ที่ไม่มีอยู่ในตาราง foreign

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


16

คุณจะต้องโพสต์คำชี้แจงเพื่อความกระจ่าง แต่...

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


5

ปัญหาไม่ได้อยู่กับ client_id จากสิ่งที่ฉันเห็น ดูเหมือนว่าปัญหาจะเกิดขึ้นกับคอลัมน์ที่ 4 คือ sup_item_cat_id

ฉันจะวิ่ง

sp_helpconstraint sup_item

และให้ความสนใจกับคอลัมน์ constraint_keys ที่ส่งคืนสำหรับ foreign key FK_Sup_Item_Sup_Item_Cat เพื่อยืนยันว่าคอลัมน์ใดเป็นปัญหาจริง แต่ฉันค่อนข้างมั่นใจว่าไม่ใช่คนที่คุณพยายามแก้ไข นอกจากนี้ '123123' ก็ดูน่าสงสัยเช่นกัน


5

สิ่งที่ฉันพบคือฟิลด์ทั้งหมดต้องตรงทั้งหมด

ตัวอย่างเช่นการส่ง 'cat dog' นั้นไม่เหมือนกับการส่ง 'catdog'

สิ่งที่ฉันทำเพื่อแก้ไขปัญหานี้คือการเขียนรหัส FK จากตารางที่ฉันใส่ข้อมูลเข้าไปจดบันทึก "Foreign Key" ที่มีข้อ จำกัด (ในกรณีของฉันมี 2) และตรวจสอบให้แน่ใจว่าค่าทั้งสองฟิลด์ตรงกัน ตรงตามที่พวกเขาอยู่ในตารางที่ขว้างข้อผิดพลาด FK Constraint

เมื่อฉันแก้ไขปัญหาทั้งสองด้านแล้วชีวิตก็ดี!

หากคุณต้องการคำอธิบายที่ดีกว่านี้ให้ฉันรู้


นี่ช่วยฉันได้จริงๆฮ่า ๆ ! มองข้ามข้อเท็จจริงนี้แก้ไขปัญหาที่ฉันมี! ขอบคุณ
Johnathan Brown

4

ฉันยังได้รับข้อผิดพลาดเดียวกันในรหัส SQL ของฉันวิธีนี้ใช้ได้สำหรับฉัน


ตรวจสอบข้อมูลในตารางหลักอาจเป็นว่าคุณกำลังป้อนค่าคอลัมน์ที่ไม่ปรากฏในคอลัมน์คีย์หลัก


3

มันหมายถึงสิ่งที่มันพูด คุณกำลังพยายามแทรกค่าลงในคอลัมน์ที่มีข้อ จำกัด FK ซึ่งไม่ตรงกับค่าใด ๆ ในตารางการค้นหา


2

ตรวจสอบฟิลด์ในความสัมพันธ์ที่กำหนด foreign key อีกครั้ง SQL Server Management Studio อาจไม่มีเขตข้อมูลที่คุณต้องการเลือกเมื่อคุณกำหนดความสัมพันธ์ สิ่งนี้ได้เผาฉันในอดีต


2
  1. เรียกใช้ sp_helpconstraint
  2. จ่าย ATTENTION ให้กับคอลัมน์ constraint_keys ที่ส่งคืนสำหรับคีย์ต่างประเทศ

2

ข้อมูลตารางหลักที่หายไปทำให้เกิดปัญหา ในปัญหาของคุณไม่มีข้อมูลใน "dbo.Sup_Item_Cat" ทำให้เกิดปัญหา


1

ฉันมีปัญหาเดียวกันเมื่อฉันใช้การย้ายรหัสครั้งแรกเพื่อสร้างฐานข้อมูลของฉันสำหรับแอปพลิเคชัน MVC 5 ในที่สุดฉันก็พบวิธีการเพาะในไฟล์ configuration.cs ของฉันที่จะทำให้เกิดปัญหา วิธีเริ่มต้นของฉันกำลังสร้างรายการตารางสำหรับตารางที่มีคีย์ต่างประเทศก่อนสร้างรายการด้วยคีย์หลักที่ตรงกัน


1

ฉันพบปัญหานี้เมื่อเขตข้อมูลค่าแทรกของฉันมีแท็บและช่องว่างที่ไม่สามารถมองเห็นได้ด้วยตาเปล่า ฉันสร้างรายการค่าของฉันใน Excel คัดลอกและวางลงใน SQL และเรียกใช้คิวรีเพื่อค้นหารายการที่ไม่ตรงกับเขตข้อมูล FK ของฉัน

ข้อความค้นหาที่ตรงกันไม่พบว่ามีแท็บและช่องว่างในฟิลด์ FK ของฉัน แต่ INSERT ไม่รู้จักพวกเขาและยังคงสร้างข้อผิดพลาดต่อไป

ฉันทดสอบอีกครั้งโดยการคัดลอกเนื้อหาของเขตข้อมูล FK ในหนึ่งระเบียนแล้ววางลงในคิวรีแทรก เมื่อบันทึกนั้นล้มเหลวฉันก็ตรวจดูข้อมูลและตรวจพบแท็บ / ช่องว่างในที่สุด

เมื่อฉันทำความสะอาดแท็บ / ช่องว่างที่ถูกลบออกปัญหาของฉันได้รับการแก้ไขแล้ว หวังว่านี่จะช่วยใครซักคน!

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