it-swarm.com.de

MySQL-Spalte hinzufügen, falls nicht vorhanden

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = 'email_subscription' AND COLUMN_NAME = 'subscribe_all')
  THEN 
  ALTER TABLE email_subscription
  ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
  ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;

Ich habe mir sehr viele Beispiele angeschaut. aber diese Abfrage funktioniert nicht, ich habe folgende Fehlermeldung erhalten:

ERROR 1064 (42000): Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüf den Handbuch, das Ihrer MySQL-Server-Version für das Recht entspricht zu verwendende Syntax in der Nähe von 'IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =' in Zeile 1

29
phil88530

sie können eine Prozedur für die Abfrage erstellen.

DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
    DECLARE _count INT;
    SET _count = (  SELECT COUNT(*) 
                    FROM INFORMATION_SCHEMA.COLUMNS
                    WHERE   TABLE_NAME = 'email_subscription' AND 
                            COLUMN_NAME = 'subscribe_all');
    IF _count = 0 THEN
        ALTER TABLE email_subscription
            ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
            ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;
    END IF;
END $$
DELIMITER ;
23
John Woo

Wenn Ihr Host Ihnen nicht die Berechtigung zum Erstellen oder Ausführen von Prozeduren erteilt, denke ich, dass ich einen anderen Weg gefunden habe, dies mit PREPARE/EXECUTE und dem Abfragen des Schemas zu tun:

SET @s = (SELECT IF(
    (SELECT COUNT(*)
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE table_name = 'table_name'
        AND table_schema = DATABASE()
        AND column_name = 'col_name'
    ) > 0,
    "SELECT 1",
    "ALTER TABLE table_name ADD col_name VARCHAR(100)"
));

PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
26
drsimonz

Sie verwenden die MS SQL Server-Syntax in MySQL.

4
Hamlet Hakobyan

Es gibt keine entsprechende Syntax, um dies in einer einzelnen MySQL-Anweisung zu erreichen.

Um etwas ähnliches zu bekommen, können Sie entweder

1) Versuchen Sie, die Spalte mit einer ALTER TABLE hinzuzufügen, und lassen Sie MySQL einen Fehler auslösen, wenn eine Spalte dieses Namens bereits in der Tabelle vorhanden ist

2) Fragen Sie die Sicht information_schema.columns ab, um zu prüfen, ob eine Spalte dieses Namens in der Tabelle vorhanden ist. 

Beachten Sie, dass Sie wirklich nach dem table_schema sowie dem table_name suchen müssen:

SELECT column_name
  FROM information_schema.columns 
 WHERE table_schema = 'foo'
   AND table_name   = 'email_subscription'
   AND column_name  = 'subscribe_all'

und entscheiden Sie auf dieser Grundlage, ob Sie die ALTER TABLE ausführen möchten

3
spencer7593

Fügen Sie außerdem eine Bedingung für den Datenbanknamen hinzu, um die Existenz der Spalte zu überprüfen.

Versuche dies: 

DELIMITER $$
CREATE PROCEDURE sp_AlterTable()
BEGIN
    IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                   WHERE TABLE_SCHEMA = 'dbName' AND 
                         TABLE_NAME = 'email_subscription' AND 
                         COLUMN_NAME = 'subscribe_all') THEN 
       ALTER TABLE email_subscription
          ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
          ADD COLUMN subscribe_category VARCHAR(512) DEFAULT NULL;
    END IF; 
END $$
DELIMITER ;
2
Saharsh Shah
SET @s = (SELECT IF(
    (SELECT COUNT(column_name)
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE table_name = 'oc_bitcoin_wallets_receive'
          AND table_schema = 'k_opencart2'
          AND column_name = 'test3'
    ) > 0,
    "SELECT 1",
    "ALTER TABLE `oc_bitcoin_wallets_receive` ADD COLUMN `test3` INT NOT NULL AFTER `test2`;"
));
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Werte für die Bearbeitung: oc_bitcoin_wallets_receive - Tabellenname, k_opencart2 - Datenbankname test3 - Name der neuen Spalte oc_bitcoin_wallets_receive - zweite Standorttabelle test3 - zweite Standortspalte, test2 - Name der Spalte vor der neuen Spalte.

0
rkm432