web-dev-qa-db-fra.com

MySql - Créer une table s'il n'existe pas sinon tronquer?

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.

20
shmuel613

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:

  1. CREATE TEMPORARY TABLE SI PAS EXISTS fubar (id int, nom varchar (80))
  2. TRONCATE TABLE fubar
  3. INSERT INTO fubar SELECT * FROM barfu

ou simplement déposer et recréer

  1. DROP TABLE SI EXISTE fubar
  2. CREATE TEMPORARY TABLE fubar SELECT ID, nom FROM barfu

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.)

22
mdahlman

exécuter une requête si la table existe.

Usage: call Edit_table(database-name,table-name,query-string);

  • 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.
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 ;

Plus sur Mysql

3
kedar

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
3
Mark Janssen

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?

2
Ben

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!

0
shmuel613

Si vous utilisez PHP, utilisez mysql_list_tables pour vérifier que la table existe avant TRUNCATE.

0
Lastnico