MySql - Créer une table s'il n'existe pas sinon tronquer?
Question
Voici la question mise à jour:
la requête en cours fait quelque chose comme:
$sql1 = "TRUNCATE TABLE fubar";
$sql2 = "CREATE TEMPORARY TABLE IF NOT EXISTS fubar SELECT id, name FROM barfu";
La première fois que la méthode contenant cette méthode est exécutée, un message d'erreur est généré sur la troncature car la table n'existe pas encore.
Est-ce que ma seule option est de faire le CREATE TABLE
, d'exécuter le TRUNCATE TABLE
, puis de remplir le tableau? (3 requêtes distinctes)
la question initiale était:
J'ai eu du mal à essayer de comprendre si ce qui suit est possible dans MySql sans avoir à écrire du bloc SQL:
CREATE TABLE fubar IF NOT EXISTS ELSE TRUNCATE TABLE fubar
Si j'exécute tronquer séparément avant la table create et que celle-ci n'existe pas, un message d'erreur s'affiche. J'essaie d'éliminer ce message d'erreur sans avoir à ajouter d'autres requêtes.
Ce code sera exécuté avec PHP.
La solution
shmuel613, il serait préférable de mettre à jour votre question initiale plutôt que de répondre. Il est préférable qu’un seul endroit contienne la question complète au lieu de l’étaler dans une discussion.
La réponse de Ben est raisonnable, sauf qu'il semble avoir un "non" là où il n'en veut pas. Ne laisser tomber la table que s’il n'existe pas , n'est pas tout à fait correct.
Vous aurez en effet besoin de plusieurs déclarations. Soit créer, puis conditionner:
- CREER UNE TABLE TEMPORAIRE SI NON EXISTE fubar (id int, nom varchar (80))
- foncier TRUNCATE TABLE
- INSERT INTO fubar SELECT * FROM barfu
ou simplement déposer et recréer
- DROP TABLE IN EXISTS fubar
- CREATE TEMPORARY TABLE fubar SELECT id, nom FROM barfu
Avec le SQL pur, ce sont vos deux vraies classes de solutions. J'aime mieux le second.
(Avec une procédure stockée, vous pouvez la réduire à une seule instruction. Quelque chose comme: TruncateAndPopulate (fubar). Mais au moment où vous écrivez le code pour TruncateAndPopulate (), vous passerez plus de temps que le code SQL ci-dessus.)
Autres conseils
Vous pouvez faire le tronçon après le "créer si n'existe pas". De cette façon, il existera toujours ... et sera toujours vide à ce stade.
CREATE TABLE fubar IF NOT EXISTS
TRUNCATE TABLE fubar
exécuter une requête si la table existe.
Utilisation: appel Edit_table (nom de la base de données, nom de la table, chaîne de requête);
- La procédure vérifiera l'existence d'un nom de table sous nom de base de données et exécutera la chaîne de requête si elle existe. Voici la procédure stockée:
DELIMITER $ DROP PROCEDURE IF EXISTS `Edit_table` $ CREATE PROCEDURE `Edit_table` (in_db_nm varchar(20), in_tbl_nm varchar(20), in_your_query varchar(200)) DETERMINISTIC BEGIN DECLARE var_table_count INT; select count(*) INTO @var_table_count from information_schema.TABLES where TABLE_NAME=in_tbl_nm and TABLE_SCHEMA=in_db_nm; IF (@var_table_count > 0) THEN SET @in_your_query = in_your_query; #SELECT @in_your_query; PREPARE my_query FROM @in_your_query; EXECUTE my_query; ELSE select "Table Not Found"; END IF; END $ DELIMITER ;
que diriez-vous:
DROP TABLE IF EXISTS fubar;
CREATE TABLE fubar;
Ou voulez-vous dire que vous voulez simplement le faire avec une seule requête?
OK alors, pas mal. Pour être plus précis, la requête en cours fait quelque chose comme:
$sql1 = "TRUNCATE TABLE fubar"; $sql2 = "CREATE TEMPORARY TABLE IF NOT EXISTS fubar SELECT id, name FROM barfu";
La première fois que la méthode contenant cette méthode est exécutée, un message d'erreur est généré sur la troncature car la table n'existe pas encore.
Est-ce que ma seule option est de créer "CREATE TABLE", exécuter "TRUNCATE TABLE", puis de remplir le tableau? (3 requêtes distinctes)
PS - Merci d'avoir répondu si rapidement!
Si vous utilisez PHP, utilisez mysql_list_tables pour vérifier que la table existe avant TRUNCATE.