2014-07-04 14 views
8

existiert habe ich diesen Code:mysql ALTER TABLE, wenn die Spalte nicht

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

Und ich möchte diese Tabelle ändern, nur dann, wenn diese Spalte doesnt existieren.

Ich habe viele differents Möglichkeiten versucht, aber nichts funktioniert:

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

Mit Prozedur:

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 ; 

ich in END erhielt Fehler IF, dann in END und dann in 1

Wie kann ich das so einfach wie möglich machen?

+1

mögliche Duplikate von [MySQL Spalte hinzufügen, wenn nicht vorhanden] (http://stackoverflow.com/questions/14381895/mysql-add-column-if-not-exist) – Rikesh

+0

mögliches Duplikat von [MySQL: Wie füge ich eine Spalte hinzu, wenn sie noch nicht existiert?] (http://stackoverflow.com/questions/3242080/mysql-how-to-add-a-column-if-it-doesnt -ready-exist) –

+0

Ich habe diese Antwort versucht! Ich habe Fehler – BrunoRamalho

Antwort

19

Verwenden Sie die folgenden in einer gespeicherten Prozedur helfen:

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

Das funktioniert nur in MySQL 5.0 und neuer. –

+1

"[I] n eine gespeicherte Prozedur" ist es wert, hier zu wiederholen. Das obige ist T-SQL allein gültig, und hauptsächlich benutzend für die letzten paar Jahre, schlug ich meinen Kopf für ein kleines bisschen, bevor ich diesen Pfosten wieder las. – rstackhouse

3

hoffe, dies wird Ihnen

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

oder

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

Verwenden Prepare/execute-und das Schema abfragt. Gastgeber keine Berechtigung haben müssen Prozeduren erstellen oder ausführen:

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

Viel einfachere Antwort. –

+0

1+ Ich benutze es, aber ich habe einige Probleme mit PHP, aber trotzdem mag ich diesen Ansatz. http://dba.stackexchange.com/questions/160476/mysql-throws-error-but-if-copied-from-error-message-or-die-into-phpmyadmin-it – ddlab

3

Hier ist eine Lösung, die Abfrage nicht INFORMATION_SCHEMA mit sich bringt, ignoriert er einfach den Fehler, wenn die Spalte vorhanden ist.

P.S. Fühlen Sie sich frei, ihm einen anderen Namen zu geben als ?

+0

Ich bin überrascht, diese Antwort ist nicht besser rangiert. Gibt es einen Grund dafür? Sieht elegant zu mir aus. –

Verwandte Themen