Możesz to zrobić trochę na około i bez sensu, ale dać się da to zrobić constraint-ami:
CREATE TABLE `SUBJECT` (
`id` int,
`type` int,
PRIMARY KEY (`id`, `type`),
UNIQUE (`id`)
);
CREATE TABLE `GROUP` (
`id` int,
`type` int,
PRIMARY KEY (`id`, `type`),
UNIQUE (`id`)
);
CREATE TABLE `SUBGRPREL` (
`sub_id` int,
`grp_id` int,
`type` int,
PRIMARY KEY(`sub_id`, `grp_id`),
FOREIGN KEY (`sub_id`, `type`) REFERENCES `SUBJECT`(`id`, `type`),
FOREIGN KEY (`grp_id`, `type`) REFERENCES `GROUP`(`id`, `type`)
);
INSERT INTO `SUBJECT` (`id`, `type`) VALUES (10, 1);
INSERT INTO `SUBJECT` (`id`, `type`) VALUES (20, 1);
INSERT INTO `GROUP` (`id`, `type`) VALUES (30, 1);
INSERT INTO `GROUP` (`id`, `type`) VALUES (40, 2);
INSERT INTO `SUBGRPREL` (`sub_id`, `grp_id`, `type`) VALUES (10, 30, 1); -- spoko, działa
INSERT INTO `SUBGRPREL` (`sub_id`, `grp_id`, `type`) VALUES (20, 30, 1); -- spoko, działa
INSERT INTO `SUBGRPREL` (`sub_id`, `grp_id`, `type`) VALUES (10, 40, 2); -- wywali się nie ważne czy wstawisz 1 czy 2 jako trzeci parametr, któryś z FK się będzie pluć ergo nie dodasz czegoś takiego
Cały myk polega na tym, żeby dodać unique na ID w tabelach GROUP/SUBJECT, żeby nie móc dodać dwóch tych samych id ze względu na złożony klucz główny.
Imho lepiej zrobić to w logice aplikacji, ale zostawiam to, bo dać się da, może komuś się przyda do czegoś.