2009-12-24 6 views
0

Dit simplement: J'ai une table avec 2 colonnes: l'un est nom d'utilisateur et l'autre est surnom. J'ai une autre table où j'ai 2 colonnes: l'un est nom d'utilisateur et l'autre est countNicknames.Référence clé étrangère dans mysql innodb

Je veux countNicknames pour contenir le nombre de surnoms chaque utilisateur (et chaque fois que j'insérer un nouveau surnom au tableau 1, la valeur sous table2.countNicknames mettra automatiquement à jour.

Pouvez-vous s'il vous plaît écrivez comment construire la deuxième table de référence le premier?

Répondre

5

Pourquoi ne pas compter juste au moment où vous avez besoin de la valeur?

+0

convenu, beaucoup plus fiable. – awithrow

1

Eh bien, @ suggestion de Lasse est meilleur, mais ... il y a deux autres options ... autre

  1. Est-ce que MySql a des déclencheurs? Si c'est le cas, vous devez ajouter un déclencheur Insert, Update, Delete sur la première table qui met à jour (ou insère ou supprime si nécessaire) l'attribut CountNickNames de la deuxième table chaque fois qu'un enregistrement est inséré, Mis à jour ou supprimé de la première table. .

    Créer Trigger NickNameCountTrig sur NickNameCountTable Insert, Update, Delete Comme Mise à jour NCT Set CountNickNames = (Select Count () De FirstTable Où Name = nct.Name) De NickNameCountTable NCT Où Nom Dans (Sélectionnez le nom distinct parmi Union Sélectionnez le nom distinct de supprimé) - ----------------------------------------- ------ Insérer NickNameCountTable (nom, CountNickNames) nom Select, count () de FirstTable pieds Où Non Exists (Select * From NickNameCountTable Où Name = ft.Name) - ---- - Cette option est facultative ----------------------- Supprimer NickNameCountTable Où CountNickNames = 0

  2. -t-MySql ont des vues indexées (ou un equivilent)? apparemment pas - si jamais l'esprit cette option ....

+0

MySQL n'a pas de vues indexées/matérialisées.Même alors, les vues MySQL n'autorisent pas les sous-requêtes en leur sein pour une raison étrange. –

+0

ahh, alors bien ... peu importe ... –

1

Je veux countNicknames contenir le nombre de surnoms chaque utilisateur (et chaque fois que j'insérer un nouveau surnom au tableau 1, la valeur sous table2. countNicknames mettra à jour automatiquement.

C'est effectivement ce une vue fera.

CREATE OR REPLACE VIEW user_nickname_count AS 
    SELECT t.username, 
      COUNT(*) 'countNicknames' 
     FROM TABLE t 
    GROUP BY t.username 

une vue semble comme une table, donc vous vous joignez à lui si nécessaire. Et le seul inconvénient est qu'il s'agit simplement d'une requête SELECT exécutée - les valeurs sont calculées à la demande, plutôt que d'avoir à configurer des déclencheurs.

Pour plus d'informations info on views, see the documentation.