Les éditeurs de SGBD en sont restés à des principes trop simplistes, notamment en ce qui concerne le concept de clé primaire qui en fait est adaptable...
Si le SGBD trop simpliste exige que l’auto-incrémentation ne fonctionne que pour une clé primaire mono-colonne, soit, ça n’est pas grave. Un truc qui marche avec SQL Server (et bien d’autres), consiste alors à définir {CourseId} comme clé primaire, et la paire {ReunionId, CourseId} comme surclé (COURSE_NO_AK) de la table COURSE et servira de référence pour les clés étrangères :
CREATE TABLE COURSE
(
ReunionId INT NOT NULL
, CourseId INT IDENTITY(1,1)
, PrixId INT NOT NULL
, CourseNumero INT NOT NULL
, CourseDuree TIME NOT NULL
, CourseAllocation INT NOT NULL
, CONSTRAINT COURSE_PK PRIMARY KEY (CourseId)
, CONSTRAINT COURSE_CO_AK UNIQUE (ReunionId, CourseId)
, CONSTRAINT COURSE_NO_AK UNIQUE (ReunionId, CourseNumero)
, CONSTRAINT COURSE_REUNION_FK FOREIGN KEY (ReunionId)
REFERENCES REUNION
, CONSTRAINT COURSE_PRIX_FK FOREIGN KEY (PrixId)
REFERENCES PRIX (PrixId)
) ;
Vérifions la bonne marche des références entre tables. Toujours avec SQL Server, la table QUINTE (à laquelle on ne touche pas !) fait de facto référence non pas à la clé primaire de COURSE, mais à la surclé COURSE_NO_AK. Rappel de la structure :
CREATE TABLE QUINTE
(
ReunionId INT NOT NULL
, CourseId INT NOT NULL
, Rapport_Ordre DECIMAL(9,2) NOT NULL
, Rapport_Desordre DECIMAL(9,2) NOT NULL
, CONSTRAINT QUINTE_PK PRIMARY KEY (ReunionId, CourseId)
, CONSTRAINT QUINTE_COURSE_FK FOREIGN KEY (ReunionId, CourseId)
REFERENCES COURSE (ReunionId, CourseId)
ON DELETE CASCADE
) ;
En reprenant le bout de jeu d’essai de mon post précédent :
INSERT INTO COURSE (ReunionId, PrixId, CourseNumero, CourseDuree, CourseAllocation)
SELECT
(SELECT ReunionId FROM REUNION WHERE ReunionNumero = 116)
, (SELECT PrixId FROM PRIX WHERE PrixNom = 'Grand prix de la reine')
, 67, '00:02:05', 5000
;
SELECT '' AS COURSE, * FROM COURSE
;
INSERT INTO QUINTE (ReunionId, CourseId, Rapport_Ordre, Rapport_Desordre)
SELECT
(SELECT ReunionId FROM COURSE WHERE CourseNumero = 67)
, (SELECT CourseId FROM COURSE WHERE CourseNumero = 67)
, 1500, 65
;
SELECT '' AS QUINTE, * FROM QUINTE
Au résultat :
COURSE (ReunionId CourseId PrixId CourseNumero CourseDuree CourseAllocation)
2 1 2 67 00:02:05 5000
QUINTE (ReunionId CourseId Rapport_Ordre Rapport_Desordre)
2 1 1500 65
Est-ce que ça passe avec SQLite ?
Partager