Bij het designen van een database ben ik tegen een probleem aangelopen.
Het probleem komt er op neer dat ik 1 van 2 foreign key colums wil setten. de andere moet NULL blijven.
Het is de bedoeling dat 'CalLSettings_Monteur_Group' OF een monteurID OF een GroupID bevat. Afhankelijk wat voor type oproep (groep of monteur).
Ik heb de volgende table definitie:
de foreign key's waar het om gaat zijn :
Ik heb het geprobeerd om via een constrain af te dwingen, omdat MS-SQL server 2005 (de uiteindelijke server) de XOR niet ondersteund. heb ik een AND/OR check gemaakt:
Ik zou verwachten dat hij op deze manier blokkeert dat ik in zowel een GroupID als een MonteurID kan invoeren. Maar wel afdwingt DAT er 1 ingevuld is. En dat degene welke is ingevuld, goed wordt opgepakt door de foreign key, waardoor de intergriteit gewaarborgt blijft.
Echter kan ik op deze manier nog altijd zowel 2 maal 'NULL' als 2 geldige waarden invullen. Deze geldigheid wordt wel gecheckt. de foreign key constrains werken dus wel naar behoren.
Omdat het MS-SQL server 2005 betreft heb ik ook al op MSDN rondgekeken. hier heb ik echter niets kunnen vinden over dit specifieke probleem (foreign key "keuze").
Het probleem komt er op neer dat ik 1 van 2 foreign key colums wil setten. de andere moet NULL blijven.
Het is de bedoeling dat 'CalLSettings_Monteur_Group' OF een monteurID OF een GroupID bevat. Afhankelijk wat voor type oproep (groep of monteur).
Ik heb de volgende table definitie:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| Create table [dbo].[Call_Settings] [ID] Integer Identity(1,1) NOT NULL, -- meer call eigenschappen Primary Key ([ID]) ON [PRIMARY] Create table [dbo].[Group] [ID] Integer Identity(1,1) NOT NULL, -- meer group eigenschappen Primary Key ([ID]) ON [PRIMARY] Create table [dbo].[Monteur] [ID] Integer Identity(1,1) NOT NULL, -- meer monteur eigenschappen Primary Key ([ID]) ON [PRIMARY] Create table [dbo].[CalLSettings_Monteur_Group] [ID] Integer Identity(1,1) NOT NULL, [CSID] Integer NOT NULL, [MonteurID] Integer, [GroupID] Integer, Primary Key ([ID],[CSID]) ON [PRIMARY] |
de foreign key's waar het om gaat zijn :
SQL:
1
2
3
4
5
6
7
8
9
10
| ALTER TABLE [dbo].[CalLSettings_Monteur_Group] WITH CHECK ADD FOREIGN KEY([GroupID]) REFERENCES [dbo].[Group] ([ID]) ALTER TABLE [dbo].[CalLSettings_Monteur_Group] WITH CHECK ADD FOREIGN KEY([MonteurID]) REFERENCES [dbo].[Monteur] ([ID]) ALTER TABLE [dbo].[CalLSettings_Monteur_Group] WITH CHECK ADD FOREIGN KEY([CSID]) REFERENCES [dbo].[Call_Settings] ([ID]) ON UPDATE CASCADE ON DELETE CASCADE |
Ik heb het geprobeerd om via een constrain af te dwingen, omdat MS-SQL server 2005 (de uiteindelijke server) de XOR niet ondersteund. heb ik een AND/OR check gemaakt:
SQL:
1
2
| ADD CONSTRAINT [Check_Call_Type] CHECK (([MonteurID]=NULL AND [GroupId]<>NULL) OR ([GroupID]=NULL AND [MonteurID]<>NULL)) |
Ik zou verwachten dat hij op deze manier blokkeert dat ik in zowel een GroupID als een MonteurID kan invoeren. Maar wel afdwingt DAT er 1 ingevuld is. En dat degene welke is ingevuld, goed wordt opgepakt door de foreign key, waardoor de intergriteit gewaarborgt blijft.
Echter kan ik op deze manier nog altijd zowel 2 maal 'NULL' als 2 geldige waarden invullen. Deze geldigheid wordt wel gecheckt. de foreign key constrains werken dus wel naar behoren.
Omdat het MS-SQL server 2005 betreft heb ik ook al op MSDN rondgekeken. hier heb ik echter niets kunnen vinden over dit specifieke probleem (foreign key "keuze").