Подтвердить что ты не робот

Проверьте, существует ли столбец перед 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

4b9b3361

Ответ 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