Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/12/2012, 14h40   #1
Slash__
Invité de passage
 
Homme Stephane
Étudiant
Inscription : décembre 2012
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Stephane

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2012
Messages : 5
Points : 2
Points : 2
Par défaut Problème de violation

Bonjour à tous,

Ceci est mon premier message je m'excuse donc d'avance si j'oublie une formalité quelconque.
Mon problème est le suivant :

je possède deux tables créées de cette façon :

Code :
1
2
3
4
5
6
7
	CREATE TABLE utilisateur
(
  id serial NOT NULL,
  login character varying(10) NOT NULL,
  mdp character varying(10) NOT NULL,
  CONSTRAINT utilisateur_pkey PRIMARY KEY (id)
)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE liste
(
  id serial NOT NULL,
  idutilisateur integer,
  nom character varying(30) NOT NULL,
  element integer,
  elementcoche integer,
  modele BOOLEAN,
  CONSTRAINT liste_pkey PRIMARY KEY (id),
  CONSTRAINT liste_idutilisateur_fkey FOREIGN KEY (idutilisateur)
      REFERENCES utilisateur (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
Tout cela fonctionne, je peux ensuite ajouter des données dans les deux tables. Seulement, si l'utilisateur avec l'id numéro 1 possède une liste et que je modifie l'id de l'utilisateur numéro 1, j'ai le droit à :

Code :
1
2
3
4
5
6
7
8
9
10
11
ERREUR:  UPDATE ou DELETE sur la TABLE « utilisateur » viole la contrainte de clé étrangère
« liste_idutilisateur_fkey » de la TABLE « liste »
DETAIL:  La clé (id)=(1) est toujours référencée à partir de la TABLE « liste ».
 
 
********** Erreur **********
 
ERREUR: UPDATE ou DELETE sur la TABLE « utilisateur » viole la contrainte de clé étrangère
« liste_idutilisateur_fkey » de la TABLE « liste »
État SQL :23503
Détail :La clé (id)=(1) est toujours référencée à partir de la TABLE « liste ».
J'ai essayer de créer un trigger pour effectuer une modification automatique :

Code :
1
2
3
4
5
6
7
8
9
CREATE FUNCTION change_idUser() RETURNS TRIGGER AS $$
BEGIN
	UPDATE liste SET liste.idUtilisateur = new.id;
	RETURN NEW;
END;
$$ LANGUAGE plpgsql;
 
CREATE TRIGGER idUserChange AFTER UPDATE ON utilisateur
FOR EACH ROW EXECUTE PROCEDURE change_idUser();
mais cela ne fonctionne pas.

Je comprends tout à fait le problème , étant une clef étrangère je ne peux pas modifier la valeur de l'id de l'utilisateur , .. mais moi je voudrais que ce soit faisable, avez-vous une solution pour moi ?

Merci d'avance
Slash__ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 16h10   #2
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 702
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 702
Points : 2 347
Points : 2 347
Essaye ON UPDATE CASCADE au lieu de ON UPDATE NO ACTION, NO ACTION étant justement le contraire de ce que tu voudrais.
Pareil pour DELETE
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 16h13   #3
Slash__
Invité de passage
 
Homme Stephane
Étudiant
Inscription : décembre 2012
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Stephane

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2012
Messages : 5
Points : 2
Points : 2
Possibilité de faire ça avec un ALTER TABLE ?

Je l'ai modifié depuis pgadmin et cela fonctionne.
Merci beaucoup pour votre aide rapide.
Slash__ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h11.


 
 
 
 
Partenaires

Hébergement Web