2010-07-13 4 views
2

J'a été suggéré de le faireComment détecter si une table existe? MySql

SELECT table_schema, table_name FROM information_schema.tables 
WHERE table_schema = 'mydb' AND table_name='ApprovePost'; 

Cependant, il est pas fiable et cause me errors on several versions of mysql on windows and linux.

Peut-être qu'il y a un autre moyen. Est-ce que quelqu'un sait?

Ce problème est que je peux faire créer une table s'il n'existe pas, mais je fais un second passage pour ajouter la contrainte FK. Dans mon vidage SQL, je vois> 130 contient sur une seule table. La table a seulement 6 colonnes, seulement deux d'entre elles ont besoin de contraintes. Les contraintes continuent de construire et de construire chaque fois que je redémarre le serveur Apache ou chaque fois que je ressens le besoin d'appeler ma méthode init globale dans ma webapp.

+3

Est-ce que sql 'show tables de pas bon pour vous? – Yehonatan

+0

@Yehonatan: SHOW TABLES est un synonyme de INFORMATION_SCHEMA.TABLES sur MySQL - voir en bas de la page: http://dev.mysql.com/doc/refman/5.1/fr/tables-table.html –

+0

Intéressant, Yehonatan fait ne pas le montrer et je peux écrire un O WH là-dessus. –

Répondre

2

Il semble que vous ayez besoin de la commande FLUSH TABLES pour que les tables INFORMATION_SCHEMA reflètent les tables existantes.

Référence:

0

Si votre seul problème réel est maintenant recréer la clé étrangère en permanence (à part un MySQL peut-être cassée installer considérant vos autres problèmes), pourquoi ne pas:

1) donnent un symbole de contrainte (doit être unique dans la base de données) et laisser l'ajout échouer silencieusement/les attraper?

ALTER TABLE tbl ADD CONSTRAINT only_one_please FOREIGN KEY (columnname) ... 

2) ou mieux encore, ajouter la clause clé étrangère dans votre create table en premier lieu? Comme pour la question originale: Je ne sais pas pourquoi cela devrait se produire, et je ne peux pas le recréer. La sélection à partir de information_schema est tout à fait la manière préférée de vérifier cela, et elle ne m'a pas encore échoué. Mis à part une vérification de force brute comme SELECT * FROM tablename LIMIT 0; et la vérification des erreurs, vous pouvez d'abord vérifier d'autres mécanismes de mise en cache en dehors du cache de requêtes MySQL, et s'ils ne sont pas là/pas le problème, essayez un SELECT SQL_NO_CACHE table_schema, table_name FROM information_schema.tables.

+0

Cela semble différent. Je l'ai testé, ça a l'air de marcher. Le problème est que ces FK sont générés (c'est notre ORM). Comment proposez-vous le nommage only_one_please? Le nombre de FK dans la table sont connus mais les informations sur les autres tables ne le sont pas (mais les autres tables n'ont pas d'importance?) –

+0

Quelque chose comme ça serait ok? Je suppose que je peux réutiliser le même nom (comme fk_0) sur d'autres tables? 'ALTER TABLE post ADD CONTRAINT fk_ {0} FOREIGN KEY ...', i –

+1

Vous ne pouvez PAS utiliser le même symbole pour une contrainte sur d'autres tables (unique par _database_), donc l'appellation peut être basée sur nomtable + nomdechamp, ou nomtable + numéro fk (tablename_fk_0, tablename_fk_1 etc.). – Wrikken

Questions connexes