Aide pour les relations entre tables

Mammouth du PHP | 693 Messages

18 mai 2007, 22:44

Bonjour,

Je suis débutant dans les relations entre les tables SQL.

J'ai plusieurs tables correspondant aux utilisateur, avec une général et une autre part module de mon site.

J'ai mis en clef primaire le nom de login dans toutes les tables.

Comment faire pour que la suppresion d'une ligne dans la table principale entraine la suppression de chaque ligne avec le même nom de login dans toutes les tables ?

Pour information, j'utilise MySQL (si jamais ca change...)

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

18 mai 2007, 22:57

Sous MySQL ça n'existe que pour le moteur InnoDB, voir le manuel.

Au fait, plutôt que d'utiliser le login comme clé primaire je te recommanderais plutôt d'utiliser un UNSIGNED INT AUTO_INCREMENT. C'est plus compact donc plus performant.

Mammouth du PHP | 693 Messages

20 mai 2007, 18:52

Merci.

Donc si je comprend bien, je dois faire :
  • En plus de la clé ajouter une clé étrangère pour chaque table secondaire sur ma table principale
  • Mettre un index sur la clef primaire de chaque table secondaire.
Sinon, est ce possible plutot que de demmander la suppression à la suppression de demander la mise à jour d'un champ spécifique, avec une syntaxe de ce type ON DELETE SET champs1='aaa'

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

20 mai 2007, 18:56

Pour ça il te faudrait un TRIGGER, les clés étrangères ne te donne le choix que d'effacer ou rendre NULL, autant que je sache.

Mammouth du PHP | 693 Messages

20 mai 2007, 23:15

Je me suis un peu renseigner sur les TRIGGER, et d'après ce que j'ai vu, il ne permet de changer des variables SQL et je ne vois pas comment après entrainer une modification des données.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

20 mai 2007, 23:52

Je ne sais pas ce que tu as lu, mais je viens d'essayer et ça a marché comme prévu et du premier coup. Je te poste ce que j'ai utilisé. Si tu n'es pas sûr de toi, relis le manuel, il est relativement clair à ce sujet.

Ah, un dernier conseil, essaie toujours avant de dire que quelque chose ne marche pas. Et si ça ne marche pas, poste ce qui ne marche pas.

Code : Tout sélectionner

CREATE TABLE t1 ( t1_id smallint(5) unsigned NOT NULL auto_increment, PRIMARY KEY (t1_id) ); INSERT INTO t1 VALUES (1),(2),(3),(4); CREATE TABLE t2 ( t2_id smallint(5) unsigned NOT NULL auto_increment, t1_id smallint(5) unsigned NOT NULL, PRIMARY KEY (t2_id), KEY t1_id (t1_id) ); INSERT INTO t2 VALUES (1, 2),(2, 3),(3, 1),(4, 4),(5, 4),(6, 2),(7, 2),(8, 2),(9, 3),(10, 1); CREATE TRIGGER t1_ad AFTER DELETE ON t1 FOR EACH ROW UPDATE t2 SET t1_id = 33 WHERE t1_id = OLD.t1_id;

Mammouth du PHP | 693 Messages

21 mai 2007, 12:45

J'avais bien essayé de dire quelque chose comme cela, mais bon, j'ai du me tromper dans la syntaxe, et puis à 11h, ca aide pas trop à réfléchir :lol:

Mammouth du PHP | 693 Messages

23 mai 2007, 18:05

Bon, ca ne sert à rien, j'ai pas le droit d'utiliser des TRIGGER :cry: ...