เนโครแมนซิ่ง.
ฉันคิดว่าเมื่อมีคนมาถึงที่นี่เขาต้องการคีย์ต่างประเทศในคอลัมน์ในตารางที่มีคีย์ที่ไม่ซ้ำกัน
ปัญหาคือถ้าคุณมีปัญหานั้นฐานข้อมูลสคีมาจะถูกทำให้เป็นปกติ
ตัวอย่างเช่นคุณเก็บห้องไว้ในตารางโดยมีคีย์หลักของ room-uid, ฟิลด์ DateFrom และ DateTo และ uid อื่นที่นี่ RM_ApertureID เพื่อติดตามห้องเดียวกันและช่อง soft-delete เช่น RM_Status โดยที่ 99 หมายถึง 'ลบ' และ <> 99 หมายถึง 'ใช้งานอยู่'
ดังนั้นเมื่อคุณสร้างห้องแรกให้ใส่ RM_UID และ RM_ApertureID เป็นค่าเดียวกับ RM_UID จากนั้นเมื่อคุณยุติห้องเป็นวันที่และสร้างใหม่ด้วยช่วงวันที่ใหม่ RM_UID คือ newid () และ RM_ApertureID จากรายการก่อนหน้าจะกลายเป็น RM_ApertureID ใหม่
ดังนั้นหากเป็นเช่นนั้น RM_ApertureID เป็นฟิลด์ที่ไม่ซ้ำกันดังนั้นคุณจึงไม่สามารถตั้งค่าคีย์นอกในตารางอื่น
และไม่มีวิธีใดในการตั้งค่า Foreign Key ให้กับคอลัมน์ / ดัชนีที่ไม่ซ้ำกันเช่นใน T_ZO_REM_AP_Raum_Reinigung (WHERE RM_UID คือ RM_ApertureID)
แต่ในการห้ามค่าที่ไม่ถูกต้องคุณต้องตั้งค่าคีย์ต่างประเทศมิฉะนั้นข้อมูลขยะจะได้ผลลัพธ์เร็วกว่าในภายหลัง ...
ตอนนี้สิ่งที่คุณสามารถทำได้ในกรณีนี้ (ย่อมาจากการเขียนแอปพลิเคชันทั้งหมดใหม่) คือการแทรกข้อ จำกัด CHECK โดยมีฟังก์ชันสเกลาร์ตรวจสอบการมีอยู่ของคีย์:
IF EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]') AND parent_object_id = OBJECT_ID(N'[dbo].[T_ZO_REM_AP_Raum_Reinigung]'))
ALTER TABLE dbo.T_ZO_REM_AP_Raum_Reinigung DROP CONSTRAINT [Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fu_Constaint_ValidRmApertureId]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[fu_Constaint_ValidRmApertureId]
GO
CREATE FUNCTION [dbo].[fu_Constaint_ValidRmApertureId](
@in_RM_ApertureID uniqueidentifier
,@in_DatumVon AS datetime
,@in_DatumBis AS datetime
,@in_Status AS integer
)
RETURNS bit
AS
BEGIN
DECLARE @bNoCheckForThisCustomer AS bit
DECLARE @bIsInvalidValue AS bit
SET @bNoCheckForThisCustomer = 'false'
SET @bIsInvalidValue = 'false'
IF @in_Status = 99
RETURN 'false'
IF @in_DatumVon > @in_DatumBis
BEGIN
RETURN 'true'
END
IF @bNoCheckForThisCustomer = 'true'
RETURN @bIsInvalidValue
IF NOT EXISTS
(
SELECT
T_Raum.RM_UID
,T_Raum.RM_Status
,T_Raum.RM_DatumVon
,T_Raum.RM_DatumBis
,T_Raum.RM_ApertureID
FROM T_Raum
WHERE (1=1)
AND T_Raum.RM_ApertureID = @in_RM_ApertureID
AND @in_DatumVon >= T_Raum.RM_DatumVon
AND @in_DatumBis <= T_Raum.RM_DatumBis
AND T_Raum.RM_Status <> 99
)
SET @bIsInvalidValue = 'true'
RETURN @bIsInvalidValue
END
GO
IF EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]') AND parent_object_id = OBJECT_ID(N'[dbo].[T_ZO_REM_AP_Raum_Reinigung]'))
ALTER TABLE dbo.T_ZO_REM_AP_Raum_Reinigung DROP CONSTRAINT [Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]
GO
ALTER TABLE dbo.T_ZO_REM_AP_Raum_Reinigung WITH NOCHECK ADD CONSTRAINT [Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]
CHECK
(
NOT
(
dbo.fu_Constaint_ValidRmApertureId(ZO_RMREM_RM_UID, ZO_RMREM_GueltigVon, ZO_RMREM_GueltigBis, ZO_RMREM_Status) = 1
)
)
GO
IF EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]') AND parent_object_id = OBJECT_ID(N'[dbo].[T_ZO_REM_AP_Raum_Reinigung]'))
ALTER TABLE dbo.T_ZO_REM_AP_Raum_Reinigung CHECK CONSTRAINT [Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]
GO
table1.ID
?