Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Erreur en création d'une relation

2 réponses
Avatar
Hervé RESCOURIO
J'ai les trois tables suivantes :
create table "ABONNEMENT" (
"IDABONNEMENT" int not null ,
"IDABONNE" int not null ,
"IDRIB" int not null ,
primary key ("IDABONNEMENT")
);

create table "PERSONNE" (
"IDPERSONNE" int not null ,
primary key ("IDPERSONNE")
);

create table "RIB" (
"IDRIB" int not null ,
"IDPERSONNE" int not null ,
primary key ("IDRIB")
);

Avec les relations suivantes
alter table "RIB"
add constraint "FK_RIB_PERSONNE" foreign key "IDPERSONNE")
references "PERSONNE" ("IDPERSONNE")
on update cascade on delete cascade;

alter table "ABONNEMENT"
add constraint "FK_ABONNEMENT_RIB" foreign key ("IDRIB")
references "RIB" ("IDRIB")
on update cascade on delete no action;

alter table "ABONNEMENT"
add constraint "FK_ABONNEMENT_PERSONNE" foreign key ("IDABONNE")
references "PERSONNE" ("IDPERSONNE")
on update cascade on delete no action;

Lorsque j'enregistre ma dernière relation, j'ai l'erreur suivante (en
testant ce même script avec sybase je n'ai pas le pb).

table 'PERSONNE' enregistrée
table 'ABONNEMENT'
- Impossible de créer la relation 'FK_ABONNEMENT_PERSONNE'.
Erreur ODBC : [Microsoft][ODBC SQL Server Driver][SQL Server]L'introduction
d'une contrainte de clé étrangère 'FK_ABONNEMENT_PERSONNE' dans la table
'ABONNEMENT' peut provoquer des cycles ou des accès en cascade multiples.
Spécifiez ON DELETE NO ACTION ou ON UPDATE NO ACTION ou modifiez les autres
contraintes de clés étrangères
[Microsoft][ODBC SQL Server Driver][SQL Server]Impossible de créer la
contrainte. Voir les erreurs précédentes.

Merci d'avance pour vos réponses.

2 réponses

Avatar
Patrice Scribe
Pas très familier. J'ai fait un petit test par curiosité. Apparemment cela
marche si le lien entre RIB et PERSONNE est supprimé. Je pense qu'il faut
comme la doc, le précise qu'il s'agisse d'une arborescence sans cycle *y
compris pour les relations n'intervenant pas à priori dans la mise à jour*
(ce qui n'est pas dans la doc).

En général, je préfère que la clé primaire ne soit jamais changée (quitte à
utiliser une clé primaire interne à l'application et une clé "candidate"
gérée par les utilisateurs).

Patrice

--

"Hervé RESCOURIO" a écrit dans le message de
news:
J'ai les trois tables suivantes :
create table "ABONNEMENT" (
"IDABONNEMENT" int not null ,
"IDABONNE" int not null ,
"IDRIB" int not null ,
primary key ("IDABONNEMENT")
);

create table "PERSONNE" (
"IDPERSONNE" int not null ,
primary key ("IDPERSONNE")
);

create table "RIB" (
"IDRIB" int not null ,
"IDPERSONNE" int not null ,
primary key ("IDRIB")
);

Avec les relations suivantes
alter table "RIB"
add constraint "FK_RIB_PERSONNE" foreign key "IDPERSONNE")
references "PERSONNE" ("IDPERSONNE")
on update cascade on delete cascade;

alter table "ABONNEMENT"
add constraint "FK_ABONNEMENT_RIB" foreign key ("IDRIB")
references "RIB" ("IDRIB")
on update cascade on delete no action;

alter table "ABONNEMENT"
add constraint "FK_ABONNEMENT_PERSONNE" foreign key ("IDABONNE")
references "PERSONNE" ("IDPERSONNE")
on update cascade on delete no action;

Lorsque j'enregistre ma dernière relation, j'ai l'erreur suivante (en
testant ce même script avec sybase je n'ai pas le pb).

table 'PERSONNE' enregistrée
table 'ABONNEMENT'
- Impossible de créer la relation 'FK_ABONNEMENT_PERSONNE'.
Erreur ODBC : [Microsoft][ODBC SQL Server Driver][SQL


Server]L'introduction
d'une contrainte de clé étrangère 'FK_ABONNEMENT_PERSONNE' dans la table
'ABONNEMENT' peut provoquer des cycles ou des accès en cascade multiples.
Spécifiez ON DELETE NO ACTION ou ON UPDATE NO ACTION ou modifiez les


autres
contraintes de clés étrangères
[Microsoft][ODBC SQL Server Driver][SQL Server]Impossible de créer la
contrainte. Voir les erreurs précédentes.

Merci d'avance pour vos réponses.






Avatar
bruno reiter [MVP]
j'avais répondu ce matin, mais il semble qu'il y ait un peu le b... sur les NG :

Ton dessin de base (en tout cas son implémentation) est incorrect, tu pourrais
avoir avec tes contraintes:

perso
code
1
2

RIB
code perso
1 1
2 1
3 1

Abonn
Code perso RIB
1 1 1
2 2 2
3 3 2

Or c'est faux, et tes cascades seraient fausses

BR

"Hervé RESCOURIO" wrote in message
news:
J'ai les trois tables suivantes :
create table "ABONNEMENT" (
"IDABONNEMENT" int not null ,
"IDABONNE" int not null ,
"IDRIB" int not null ,
primary key ("IDABONNEMENT")
);

create table "PERSONNE" (
"IDPERSONNE" int not null ,
primary key ("IDPERSONNE")
);

create table "RIB" (
"IDRIB" int not null ,
"IDPERSONNE" int not null ,
primary key ("IDRIB")
);

Avec les relations suivantes
alter table "RIB"
add constraint "FK_RIB_PERSONNE" foreign key "IDPERSONNE")
references "PERSONNE" ("IDPERSONNE")
on update cascade on delete cascade;

alter table "ABONNEMENT"
add constraint "FK_ABONNEMENT_RIB" foreign key ("IDRIB")
references "RIB" ("IDRIB")
on update cascade on delete no action;

alter table "ABONNEMENT"
add constraint "FK_ABONNEMENT_PERSONNE" foreign key ("IDABONNE")
references "PERSONNE" ("IDPERSONNE")
on update cascade on delete no action;

Lorsque j'enregistre ma dernière relation, j'ai l'erreur suivante (en
testant ce même script avec sybase je n'ai pas le pb).

table 'PERSONNE' enregistrée
table 'ABONNEMENT'
- Impossible de créer la relation 'FK_ABONNEMENT_PERSONNE'.
Erreur ODBC : [Microsoft][ODBC SQL Server Driver][SQL Server]L'introduction
d'une contrainte de clé étrangère 'FK_ABONNEMENT_PERSONNE' dans la table
'ABONNEMENT' peut provoquer des cycles ou des accès en cascade multiples.
Spécifiez ON DELETE NO ACTION ou ON UPDATE NO ACTION ou modifiez les autres
contraintes de clés étrangères
[Microsoft][ODBC SQL Server Driver][SQL Server]Impossible de créer la
contrainte. Voir les erreurs précédentes.

Merci d'avance pour vos réponses.