2014-07-04 19 views
8

ho questo codice:mysql ALTER TABLE se colonna non esiste

ALTER TABLE `settings` 
ADD COLUMN `multi_user` TINYINT(1) NOT NULL DEFAULT 1 

e voglio modificare questa tabella solo se questa colonna doesnt esiste.

Sto cercando un sacco di differenti modi, ma non funziona niente:

ALTER TABLE `settings` 
ADD COLUMN IF NOT EXISTS `multi_user` TINYINT(1) NOT NULL DEFAULT 1 

Con procedura:

DELIMITER $$ 
CREATE PROCEDURE Alter_Table() 
BEGIN 
    DECLARE _count INT; 
    SET _count = ( SELECT COUNT(*) 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_NAME = 'settings' AND 
          COLUMN_NAME = 'multi_user'); 
    IF _count = 0 THEN 
     ALTER TABLE `settings` ADD COLUMN `multi_user` TINYINT(1) NOT NULL DEFAULT 1 
    END IF; 
END $$ 
DELIMITER ; 

ho ottenuto l'errore in END IF, poi nel END e poi in 1

Come posso rendere questo più semplice possibile?

+1

possibile duplicato di [colonna di aggiunta di MySQL se non esiste] (http://stackoverflow.com/questions/14381895/mysql-add-column-if-not-exist) – Rikesh

+0

possibile duplicato di [MySQL: Come aggiungere una colonna se non esiste già?] (http://stackoverflow.com/questions/3242080/mysql-how-to-add-a-column-if-it-doesnt -already-exist) –

+0

Ho provato questa risposta! Ho degli errori – BrunoRamalho

risposta

19

utilizza quanto segue in una stored procedure:

IF NOT EXISTS(SELECT NULL 
      FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE table_name = 'tablename' 
      AND table_schema = 'db_name' 
      AND column_name = 'columnname') THEN 

    ALTER TABLE `TableName` ADD `ColumnName` int(1) NOT NULL default '0'; 

END IF; 
+4

Funziona solo con MySQL 5.0 e successivi. –

+1

"[I] n una stored procedure" vale la pena di essere riportato qui. Quanto sopra è T-SQL valido da solo, e usando principalmente quello negli ultimi due anni, stavo sbattendo la testa per un po 'prima di rileggere questo post. – rstackhouse

3

speranza che questo vi aiuterà

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_name = 'tbl_name' 
AND table_schema = 'db_name' 
AND column_name = 'column_name' 

o

delimiter '//' 

CREATE PROCEDURE addcol() BEGIN 
IF NOT EXISTS(
SELECT * FROM information_schema.COLUMNS 
WHERE COLUMN_NAME='new_column' AND TABLE_NAME='tablename' AND TABLE_SCHEMA='the_schema' 
) 
THEN 
    ALTER TABLE `the_schema`.`the_table` 
    ADD COLUMN `new_column` TINYINT(1) NOT NULL DEFAULT 1;; 

END IF; 
END; 
// 

delimiter ';' 

CALL addcol(); 

DROP PROCEDURE addcol; 
13

Usa preparazione/esecuzione e l'interrogazione dello schema. L'host non ha bisogno di avere l'autorizzazione per creare o eseguire procedure:

SET @dbname = DATABASE(); 
SET @tablename = "tableName"; 
SET @columnname = "colName"; 
SET @preparedStatement = (SELECT IF(
    (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE 
     (table_name = @tablename) 
     AND (table_schema = @dbname) 
     AND (column_name = @columnname) 
) > 0, 
    "SELECT 1", 
    CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " INT(11);") 
)); 
PREPARE alterIfNotExists FROM @preparedStatement; 
EXECUTE alterIfNotExists; 
DEALLOCATE PREPARE alterIfNotExists; 
+0

Risposta molto più semplice. –

+0

1+ L'ho usato, ma ho avuto qualche problema con php, ma comunque mi piace questo approccio. http://dba.stackexchange.com/questions/160476/mysql-throws-error-but-if-copied-from-error-message-or-die-into-phpmyadmin-it – ddlab

3

Ecco una soluzione che non comporta l'esecuzione di query INFORMATION_SCHEMA, ignora semplicemente l'errore se la colonna esiste.

DROP PROCEDURE IF EXISTS `?`; 
DELIMITER // 
CREATE PROCEDURE `?`() 
BEGIN 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; 
    ALTER TABLE `table_name` ADD COLUMN `column_name` INTEGER; 
END // 
DELIMITER ; 
CALL `?`(); 
DROP PROCEDURE `?`; 

P.S. Sentiti libero di dargli un altro nome piuttosto che ?

+0

Sono sorpreso che questa risposta non sia migliore classificato. C'è qualche ragione per questo? Mi sembra elegante. –

Problemi correlati