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 é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 la table 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é en utilisant PHP.
shmuel613, il serait préférable de mettre à jour votre question initiale plutôt que de répondre. Il est préférable qu'il n'y ait qu'un seul endroit contenant la question complète plutôt que de l'étendre 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’est pas n’est pas tout à fait correct.
Vous aurez en effet besoin de plusieurs déclarations. Soit créer, puis peupler:
ou simplement déposer et recréer
Avec du SQL pur, ce sont vos deux vraies classes de solutions. J'aime mieux la seconde.
(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 simple SQL précédent.)
exécuter une requête si la table existe.
Usage: call Edit_table(database-name,table-name,query-string);
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 ;
Vous pouvez faire le tronçon après le 'créer si pas existe' ..__ De cette façon, il existera toujours ... et sera toujours vide à ce stade.
CREATE TABLE fubar IF NOT EXISTS
TRUNCATE TABLE fubar
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 actuelle fait quelque chose comme:
$ sql1 = "fubar de la table de tables";
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 "CREATE TABLE", d'exécuter "TRUNCATE TABLE", puis de remplir le tableau? (3 requêtes distinctes)
PS - merci d'avoir répondu si vite!
Si vous utilisez PHP, utilisez mysql_list_tables pour vérifier que la table existe avant TRUNCATE.