2008-09-17 14 views
19

Voici la question mise à jour:MySql - Créer une table si elle n'existe pas? Sinon tronquer?

la requête en cours est en train de faire 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 c'est exécuté, il génère un message d'erreur sur la troncature depuis la la table n'existe pas encore.

Est-ce que ma seule option pour faire le CREATE TABLE, exécutez le TRUNCATE TABLE, puis remplissez le tableau? (3) requêtes distinctes

question initiale était:

J'ai eu du mal à essayer de comprendre si ce qui suit est possible MySql sans avoir à écrire bloc sql:

CREATE TABLE fubar IF NOT EXISTS ELSE TRUNCATE TABLE fubar 

Si j'exécute truncate 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.

Répondre

20

shmuel613, il vaudrait mieux mettre à jour votre question originale plutôt que de répondre. Il est préférable de placer la question complète dans un seul endroit plutôt que 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. Laisser tomber la table seulement si n'existe pas existe n'est pas tout à fait raison.

Vous aurez en effet besoin de plusieurs instructions.Soit créer conditionnellement puis remplir:

  1. CREATE TABLE TEMPORAIRE SINON EXISTE fubar (id int, nom varchar (80))
  2. TRUNCATE TABLE fubar
  3. INSERT INTO fubar SELECT * FROM barfu

ou tout simplement laisser tomber et recréer

  1. DROP TABLE IF EXISTS fubar
  2. CREATE TABLE TEMPORAIRE fubar SELECT id, nom FROM barfu

Avec 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 d'écrire le code pour TruncateAndPopulate(), vous passerez plus de temps que d'utiliser le SQL ci-dessus.)

2

que diriez-vous:

drop table if exists fubar; 
create table fubar; 

Ou avez-vous vous dire voulez juste faire avec une seule requête?

+0

Déposez-le si t _n'existe pas? – 11684

+0

Oups! Bon point. – Ben

3

Vous pouvez faire le tronquer après le 'créer si n'existe pas'. De cette façon, il existera toujours ... et sera toujours vide à ce moment-là.

CREATE TABLE fubar IF NOT EXISTS 
TRUNCATE TABLE fubar 
0

OK alors, pas mal. Pour être plus précis, la requête en cours est en train de faire 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 c'est exécuté, il génère un message d'erreur sur la troncature puisque la table n'existe pas encore.

Est-ce que ma seule option est de faire le "CREATE TABLE", exécutez le "TRUNCATE TABLE", puis remplissez le tableau? (3 requêtes séparées)

PS - merci d'avoir répondu si rapidement!

3

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

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

  • procédure vérifiera l'existence de la table-nom sous base de données nom et exécutera-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 ; 

More on Mysql