2009-06-14 9 views
1

Je suis sûr que ce soit est tout à fait impossible ou très simple:MySQL colonne ENUM de la colonne anothertable

Si je crée une table et je veux l'une des colonnes d'avoir des options limitées, il semble que je l'utilise soit le type de valeur ENUM ou SET. Mais je dois définir les valeurs possibles à ce moment-là. Que faire si j'ai une autre table qui a deux colonnes, une colonne de clé primaire et une colonne de données, et je veux que l'ENUM de ma nouvelle table soit mis à la clé primaire de la colonne déjà existante? Je suis sûr que je peux juste écrire dans les valeurs de long-main, mais idéalement ce dont j'ai besoin est de nouvelles valeurs à entrer dans la table de liste et pour la table avec la colonne enum juste accepter que les choix de valeur inclura tout ce qui sera ajouté à cette liste.

Est-ce possible sans manipuler la structure de la nouvelle table chaque fois que quelque chose est ajouté à la liste?

Répondre

0

Je pense que ce lien aide: http://dev.mysql.com/doc/refman/5.0/en/enum.html

ont une discussion sur ce dans les commentaires des utilisateurs début:

« MySQL 5.0, vous pouvez convertir les valeurs d'un ENUM dans une table dynamique définie de valeurs, qui fournit alors une méthode neutre pour gérer ce type de conversion (plutôt que de s'appuyer sur PHP, Tcl, C, C++, Java, etc.) "

il le fait avec PROCÉDUR E

+0

C'est un peu le contraire de ce que j'avais en tête (bien que ce soit utile pour ce que ça donne). Je ne veux pas que mes valeurs enum soient poussées dans une table dynamique, je veux que mes valeurs enum soient définies à partir d'une table réelle. Je pense que SQL Server fait cela, ce qui me rend encore plus fou. – Anthony

0

La méthode la plus simple consiste à utiliser une colonne régulière sans contrainte. Si vous êtes intéressé par toutes les valeurs actuelles, utilisez DISTINCT pour les interroger:

select distinct YourColumn from YourTable 

De cette façon, vous n'avez pas d'entretien et peut stocker tout ce que vous aimez dans le tableau.

La table de clé étrangère que vous mentionnez est également une bonne option. La clé étrangère limitera la colonne d'origine. Avant de faire l'insertion réelle, vous exécutez une requête pour étendre la table « ENUM »:

insert into EnumTable (name) 
select 'NewEnumValue' 
where not exists (select * from EnumTable where name = 'NewEnumValue') 

Je ne sais pas ce que vous essayez d'atteindre exactement BTW; limiter la colonne, mais étendre automatiquement les choix lorsque quelqu'un dépasse la limite?

+0

Eh bien, je peux penser à beaucoup de raisons, alors peut-être que je ne pose pas la bonne question. Voici un exemple: L'utilisateur télécharge des données, dans ce cas il s'agirait de cours boursiers. Afin de garder les choses bien rangées, nous avons les cotations organisées par Market (NYSE, NASDAQ). Et les citations téléchargées sont poussées à une table avec l'une des colonnes comme "marché", qui, pour le moment, est défini comme: enum ("NYSE", "NASDAQ"). De plus, nous avons une table appelée "Markets" qui ont deux valeurs, identiques à la colonne enum. Je veux être en mesure d'ajouter "LSE" à la table de marché et de le faire refléter automatiquement sur la colonne enum. – Anthony

+0

Je verrais la table de marché comme une vue alors? "sélectionner marché distinct des devis" Si vous souhaitez conserver la table séparée, l'approche "insérer itno ... where not" devrait fonctionner. – Andomar

+1

Lorsque a.mycol se connecte à b.primaryKey, il n'y a aucun moyen de vérifier que seules les valeurs déjà présentes dans b.primaryKey sont ajoutées à a.mycol.Ce serait incroyablement utile, et devrait être simple à faire, mais ne l'est pas. – SamGoody

Questions connexes