Nécromancie.
Je suppose que lorsque quelqu'un atterrit ici, il a besoin d'une clé étrangère pour une colonne dans une table contenant des clés non uniques.
Le problème est que si vous avez ce problème, le schéma de la base de données est dénormalisé.
Vous gardez par exemple les chambres dans une table, avec une clé primaire room-uid, un champ DateFrom et un champ DateTo, et une autre uid, ici RM_ApertureID pour suivre la même chambre, et un champ de suppression souple, comme RM_Status, où 99 signifie 'supprimé', et <> 99 signifie 'actif'.
Donc, lorsque vous créez la première chambre, vous insérez RM_UID et RM_ApertureID avec la même valeur que RM_UID. Ensuite, lorsque vous terminez la chambre à une date, et que vous la rétablissez avec une nouvelle plage de dates, RM_UID est newid(), et le RM_ApertureID de l'entrée précédente devient le nouveau RM_ApertureID.
Donc, dans ce cas, si RM_ApertureID est un champ non-unique, vous ne pouvez pas définir de clé étrangère dans une autre table.
Et il n'y a aucun moyen de définir une clé étrangère sur une colonne / index non unique, par exemple dans T_ZO_REM_AP_Raum_Reinigung (où RM_UID est en réalité RM_ApertureID).
Mais pour interdire les valeurs invalides, vous devez définir une clé étrangère, sinon, les données seront corrompues tôt ou tard...
Maintenant, ce que vous pouvez faire dans ce cas (à part réécrire toute l'application) est d'insérer une contrainte de VÉRIFICATION, avec une fonction scalaire vérifiant la présence de la clé :
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
... (le reste du code pourrait également être traduit en français)
0 votes
Ça n'a pas beaucoup de sens de faire ça. Pourquoi ne pas se référer à
table1.ID
?0 votes
Il est définitif que si votre AnothidID n'est pas une clé primaire, il devrait être une clé étrangère, donc en étant une clé étrangère, votre table2 devrait pointer vers la même table (éventuellement table3)