Проверьте, существует ли столбец перед ALTER TABLE - mysql
Есть ли способ проверить, существует ли столбец в базе данных mySQL до (или как) выполнения оператора ALTER TABLE ADD coumn_name
? Тип IF column DOES NOT EXIST ALTER TABLE
.
Я пробовал ALTER IGNORE TABLE my_table ADD my_column
, но это все еще вызывает ошибку, если уже добавленный столбец уже существует.
РЕДАКТИРОВАТЬ: использовать случай, чтобы обновить таблицу в уже установленном веб-приложении. Поэтому, чтобы все было просто, я хочу убедиться, что столбцы, которые мне нужны, и если они этого не делают, добавьте их, используя ALTER TABLE
Ответы
Ответ 1
Как вы думаете, вы можете попробовать это?:
SELECT IFNULL(column_name, '') INTO @colName
FROM information_schema.columns
WHERE table_name = 'my_table'
AND column_name = 'my_column';
IF @colName = '' THEN
-- ALTER COMMAND GOES HERE --
END IF;
Это не один лайнер, но можете ли вы хотя бы посмотреть, будет ли это работать для вас? По крайней мере, ожидая лучшего решения.
Ответ 2
Так как операторы управления mysql (например, "IF" ) работают только в хранимых процедурах, временный может быть создан и выполнен:
DROP PROCEDURE IF EXISTS add_version_to_actor;
DELIMITER $$
CREATE DEFINER=CURRENT_USER PROCEDURE add_version_to_actor ( )
BEGIN
DECLARE colName TEXT;
SELECT column_name INTO colName
FROM information_schema.columns
WHERE table_schema = 'connjur'
AND table_name = 'actor'
AND column_name = 'version';
IF colName is null THEN
ALTER TABLE actor ADD version TINYINT NOT NULL DEFAULT '1' COMMENT 'code version of actor when stored';
END IF;
END$$
DELIMITER ;
CALL add_version_to_actor;
DROP PROCEDURE add_version_to_actor;
Ответ 3
Функции и процедуры утилиты
Во-первых, у меня есть набор служебных функций и процедур, которые я использую для выполнения таких действий, как сброс внешних ключей, обычных ключей и столбцов. Я просто оставляю их в базе данных, поэтому я могу использовать их по мере необходимости.
Вот они.
delimiter $$
create function column_exists(ptable text, pcolumn text)
returns bool
reads sql data
begin
declare result bool;
select
count(*)
into
result
from
information_schema.columns
where
`table_schema` = 'my_database' and
`table_name` = ptable and
`column_name` = pcolumn;
return result;
end $$
create function constraint_exists(ptable text, pconstraint text)
returns bool
reads sql data
begin
declare result bool;
select
count(*)
into
result
from
information_schema.table_constraints
where
`constraint_schema` = 'my_database' and
`table_schema` = 'my_database' and
`table_name` = ptable and
`constraint_name` = pconstraint;
return result;
end $$
create procedure drop_fk_if_exists(ptable text, pconstraint text)
begin
if constraint_exists(ptable, pconstraint) then
set @stat = concat('alter table ', ptable, ' drop foreign key ', pconstraint);
prepare pstat from @stat;
execute pstat;
end if;
end $$
create procedure drop_key_if_exists(ptable text, pconstraint text)
begin
if constraint_exists(ptable, pconstraint) then
set @stat = concat('alter table ', ptable, ' drop key ', pconstraint);
prepare pstat from @stat;
execute pstat;
end if;
end $$
create procedure drop_column_if_exists(ptable text, pcolumn text)
begin
if column_exists(ptable, pcolumn) then
set @stat = concat('alter table ', ptable, ' drop column ', pcolumn);
prepare pstat from @stat;
execute pstat;
end if;
end $$
delimiter ;
Удаление ограничений и столбцов с помощью утилит выше
С их помощью довольно легко использовать их для проверки столбцов и ограничений для существования:
-- Drop service.component_id
call drop_fk_if_exists('service', 'fk_service_1');
call drop_key_if_exists('service', 'component_id');
call drop_column_if_exists('service', 'component_id');
-- Drop commit.component_id
call drop_fk_if_exists('commit', 'commit_ibfk_1');
call drop_key_if_exists('commit', 'commit_idx1');
call drop_column_if_exists('commit', 'component_id');
-- Drop component.application_id
call drop_fk_if_exists('component', 'fk_component_1');
call drop_key_if_exists('component', 'application_id');
call drop_column_if_exists('component', 'application_id');
Ответ 4
Сделайте предложение подсчета с приведенным ниже примером Джоном Уотсоном.
SELECT count(*) FROM information_schema.COLUMNS
WHERE COLUMN_NAME = '...'
and TABLE_NAME = '...'
and TABLE_SCHEMA = '...'
Сохраните этот результат в целое число, а затем сделайте его условием применения предложения ADD COLUMN
.
Ответ 5
Хотя это довольно старая должность, но я все же чувствую себя хорошо в том, чтобы поделиться своим решением с этой проблемой. Если столбец не существует, исключение возникнет определенно, а затем я создам столбец в таблице.
Я использовал код ниже:
try
{
DATABASE_QUERY="SELECT gender from USER;";
db.rawQuery(DATABASE_QUERY, null);
}
catch (Exception e)
{
e.printStackTrace();
DATABASE_UPGRADE="alter table USER ADD COLUMN gender VARCHAR(10) DEFAULT 0;";
db.execSQL(DATABASE_UPGRADE);
}
Ответ 6
Вы можете создать процедуру с обработчиком CONTINUE в случае существования столбца (обратите внимание, что этот код не работает в PHPMyAdmin):
DROP PROCEDURE IF EXISTS foo;
CREATE PROCEDURE foo() BEGIN
DECLARE CONTINUE HANDLER FOR 1060 BEGIN END;
ALTER TABLE `tableName` ADD `columnName` int(10) NULL AFTER `otherColumn`;
END;
CALL foo();
DROP PROCEDURE foo;
Этот код не должен вызывать ошибки, если столбец уже существует. Он просто ничего не сделает и продолжит выполнение остальной части SQL.
Ответ 7
DELIMITER $$
DROP PROCEDURE IF EXISTS `addcol` $$
CREATE DEFINER=`admin`@`localhost` PROCEDURE `addcol`(tbn varchar(45), cn varchar(45), ct varchar(45))
BEGIN
#tbn: table name, cn: column name, ct: column type
DECLARE CONTINUE HANDLER FOR 1060 BEGIN END;
set cn = REPLACE(cn, ' ','_');
set @a = '';
set @a = CONCAT("ALTER TABLE `", tbn ,"` ADD column `", cn ,"` ", ct);
PREPARE stmt FROM @a;
EXECUTE stmt;
END $$
DELIMITER ;
Ответ 8
Вы можете проверить, существует ли столбец:
IF EXISTS (
SELECT * FROM information_schema.COLUMNS
WHERE COLUMN_NAME = '...'
and TABLE_NAME = '...'
and TABLE_SCHEMA = '...')
...
Просто введите имя столбца, имя таблицы и имя базы данных.
Ответ 9
Как сообществу MYSQL:
IGNORE - это расширение MySQL для стандартного SQL. Он управляет тем, как работает ALTER TABLE, если в новой таблице есть дубликаты уникальных клавиш или если предупреждения включены, когда включен строгий режим. Если IGNORE не указан, копия прерывается и откатывается, если возникают ошибки с повторяющимися ключами. Если указано IGNORE, для строк с дубликатами на уникальном ключе используется только одна строка. Остальные конфликтующие строки удаляются. Неверные значения усекаются до ближайшего подходящего значения.
Итак, рабочий код: ALTER IGNORE TABLE CLIENTS ADD CLIENT_NOTES TEXT DEFAULT NULL;
Данные, размещенные здесь:
http://dev.mysql.com/doc/refman/5.1/en/alter-table.html