Ich versuche nur dann, eine Spalte für meine Tabelle zu erstellen, wenn diese nicht vorhanden ist. Ich habe viel recherchiert, konnte aber noch keine Lösung finden.
Ist es wirklich möglich, eine Spalte bedingt zu erstellen?
Ich versuche nur dann, eine Spalte für meine Tabelle zu erstellen, wenn diese nicht vorhanden ist. Ich habe viel recherchiert, konnte aber noch keine Lösung finden.
Ist es wirklich möglich, eine Spalte bedingt zu erstellen?
Antworten:
MySQL ALTER TABLE
hat keine IF EXISTS
Spezifikation.
Sie können Folgendes mithilfe eines gespeicherten Prozesses oder einer Programmiersprache tun, wenn Sie dies regelmäßig tun müssen:
Pseudocode:
Finden Sie mithilfe der folgenden SQL heraus, ob die Spalte vorhanden ist:
AUSWÄHLEN column_name
VON INFORMATION_SCHEMA
. COLUMNS
WHERE TABLE_SCHEMA
= [Datenbankname] AND TABLE_NAME
= [Tabellenname];
Wenn die obige Abfrage ein Ergebnis zurückgibt, bedeutet dies, dass die Spalte vorhanden ist. Andernfalls können Sie die Spalte erstellen.
column_name
nicht vorhanden ist. Ich formulierte die Anfrage neu zu:SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' and column_name='[Column_name]';
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' AND column_name='[Column_name]'
Existiert jetzt tatsächlich für Maria DB 10.219
ALTER TABLE test ADD COLUMN IF NOT EXISTS column_a VARCHAR(255);
Bonus, es funktioniert auch für MODIFY
ALTER TABLE test MODIFY IF EXISTS column_a VARCHAR(255);
Sie können diese Lösung verwenden, die bereits in einem anderen StackOverFlow-Beitrag erwähnt wurde: (Ref.: Https://stackoverflow.com/a/31989541/ )
MySQL - ALTER TABLE, um eine Spalte hinzuzufügen, wenn sie nicht vorhanden ist:
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;
Das unten hat bei mir funktioniert:
SELECT count(*)
INTO @exist
FROM information_schema.columns
WHERE table_schema = 'mydatabase'
and COLUMN_NAME = 'mycolumn'
AND table_name = 'mytable' LIMIT 1;
set @query = IF(@exist <= 0, 'ALTER TABLE mydatabase.`mytable` ADD COLUMN `mycolumn` MEDIUMTEXT NULL',
'select \'Column Exists\' status');
prepare stmt from @query;
EXECUTE stmt;