I want to define a mapping in SQL. The mapping is from one source table to several target tables. I'm using referential integrity, so if a value in the source table is deleted, the value in the mapping table should be deleted as well. The defination of the tables should look somehow like that:
-- Table with source members
Create Table dbo.Source_Members
(
Id int IDENTITY(1,1) Not Null,
Name [nvarchar](50) Null
CONSTRAINT [PK_Source_Members_Id] PRIMARY KEY CLUSTERED
(
Id
)
);
-- Table with target members
Create Table dbo.Target_Members1
(
Id int IDENTITY(1,1) Not Null,
Name [nvarchar](50) Null,
Target_Table_Id int DEFAULT 1
CONSTRAINT [PK_Target_Members1_Id] PRIMARY KEY CLUSTERED
(
Id, Target_Table_Id
)
);
Create Table dbo.Target_Members2
(
Id int IDENTITY(1,1) Not Null,
Name [nvarchar](50) Null,
Target_Table_Id int DEFAULT 2
CONSTRAINT [PK_Target_Members2_Id] PRIMARY KEY CLUSTERED
(
Id, Target_Table_Id
)
);
-- Mapping table
Create Table dbo.Mapping
(
Id int IDENTITY(1,1) Not Null,
Id_Source_Members int Not Null,
Id_Target_Members int Not Null,
Target_Table_Id int Not Null
CONSTRAINT [PK_Mapping] PRIMARY KEY CLUSTERED
(
Id
)
);
-- Define first Foreign Key, referencing the source member (just one table)
Alter Table dbo.Mapping WITH CHECK
ADD CONSTRAINT [FK_Source_Members] FOREIGN KEY (Id_Source_Members) REFERENCES dbo.Source_Members (Id)
ON UPDATE CASCADE
ON DELETE CASCADE
-- Define second Foreign Key, referencing the target member (several tables)
Alter Table dbo.Mapping WITH CHECK
ADD CONSTRAINT [FK_Target_Members1] FOREIGN KEY (Id_Target_Members, Target_Table_Id) REFERENCES dbo.Target_Members1 (Id, Target_Table_Id)
ON UPDATE CASCADE
ON DELETE CASCADE
Alter Table dbo.Mapping WITH CHECK
ADD CONSTRAINT [FK_Target_Members2] FOREIGN KEY (Id_Target_Members, Target_Table_Id) REFERENCES dbo.Target_Members2 (Id, Target_Table_Id)
ON UPDATE CASCADE
ON DELETE CASCADE
But this defination is not working. I would like to insert values in the mapping table like that:
INSERT INTO dbo.Mapping(Id_Source_Members, Id_Target_Members, Target_Table_Id)
SELECT 1, 1, 1
UNION
SELECT 2, 1, 2
UNION
SELECT 3, 2, 2
Like that, the first source value should be mapped to the first value in Target_Members1. The second source value should be mapped to the first value in Target_Members2. The third source value should be mapped to the second value in Target_Members2 and so on. As I mentioned before, it's not working like that. How am I doing something like that, where is the failure?