2009-12-28 5 views
3

Je crée une VUE sur 3 TABLES. Chaque TABLE a sa clé primaire. Cependant, dans la VUE afin d'avoir une clé primaire, je devrai utiliser une clé primaire composite (combinaison de clés primaires de 3 TABLES).Comment puis-je avoir une clé primaire dans une VUE (une clé qui ne dépend pas des tables sources)

Je voudrais cependant ajouter une colonne dans la vue en tant que clé primaire qui est créée juste pour le but de la vue. Dans le cadre de la définition de VIEW, elle devrait être UNIQUE (auto-incrément car il s'agirait principalement d'un INT). Comment puis-je atteindre cet objectif?

J'utilise MySQL 5.1

Répondre

0

vous pouvez utiliser différentes méthodes pour insérer un identifiant unique aux données de vue, tels que:

SELECT @rownum:[email protected]+1 as id, mytable.* 
FROM (SELECT @rownum:=0) r, mytable; 

Toutefois, c'est pas une clé primaire, il n'est pas cohérente et changera lorsque les changements de données .

Pour quoi exactement avez-vous besoin d'une clé?

+0

Paul, inspiré de votre pensée, concatène maintenant trois touches et en tire une clé UNIQUE. Honnêtement, le mien n'est pas une exigence de la clé PRIMAIRE mais celle d'une clé UNIQUE. Merci. – Kabeer

+0

paul, si vous appliquez cela à une vue, par exemple, cela ne vous donnera pas nécessairement 'id' dans l'ordre. il vous donne un identifiant unique, mais pas dans l'ordre. une solution plutôt simple consiste à créer une table temporaire (via une insertion à partir d'une vue, par exemple) qui a un champ de numérotation automatique. Cela vous forcerait à recréer une table chaque fois que vos données changeraient, mais cela pourrait être facilement accompli en php ou java. –

+1

Comme David Clifton a dit que vous ne pouvez pas créer une vue avec 'SELECT @rownum: = @ rownum + 1 comme ID, mytable. * DE (SELECT @rownum: = 0) r, mytable;' Vous auriez un '1351 '[error] (http://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html#error_er_view_select_variable) – pconcepcion

3

Vues ne sont pas les clés primaires ou index - le moteur de MySQL utilisera les index et les clés définis sur la table de base (s).

+1

Vous avez raison. Honnêtement, le mien n'est pas une exigence de la clé PRIMAIRE mais celle d'une clé UNIQUE. Je suis en train de concaténer trois clés et d'en faire une clé UNIQUE. – Kabeer

0

Une vue est simplement une sous-requête stockée. L'idée d'un PK n'est pas pertinente.

... sauf si vous avez besoin d'une vue indexée, dans ce cas, vous avez besoin d'un index cluster sur la vue (mais pas nécessairement une clé primaire)

(bien que, je parle SQL Server ... Je ne sais pas comment cela se traduit par MySQL)

10

le plus haut voté réponse à l'aide

SELECT @rownum:[email protected]+1 as id, mytable.* 
FROM (SELECT @rownum:=0) r, mytable; 

est incorrect - vous ne pouvez pas créer une vue dans une base MySQL qui utilise un sous-sélection dans la FROM. Votre seule option est de traiter un ensemble de colonnes comme une clé composite.

+3

Et MySQL ne supporte pas les vues indexées, donc c'était juste de répondre comment obtenir un identifiant unique. Quoi qu'il en soit, +1 pour le signaler. – fancyPants

+0

Vous ne pouvez même pas utiliser des variables dans une sélection qui créera une vue. D'accord, la solution est une clé composite. –