добавить столбец в таблицу MySQL, если он не существует - PullRequest
101 голосов
/ 10 июня 2009

Мои исследования и эксперименты пока не дали ответа, поэтому я надеюсь на некоторую помощь.

Я изменяю установочный файл приложения, в предыдущих версиях которого не было столбца, который я хочу добавить сейчас. Я не хочу добавлять столбец вручную, но в установочном файле и только в том случае, если новый столбец еще не существует в таблице.

Таблица создается следующим образом:

CREATE TABLE IF NOT EXISTS `#__comm_subscribers` (
      `subscriber_id` int(11) NOT NULL auto_increment,
      `user_id` int(11) NOT NULL default '0',
      `subscriber_name` varchar(64) NOT NULL default '',
      `subscriber_surname` varchar(64) NOT NULL default '',
      `subscriber_email` varchar(64) NOT NULL default '',
      `confirmed` tinyint(1) NOT NULL default '0',
      `subscribe_date` datetime NOT NULL default '0000-00-00 00:00:00',
      PRIMARY KEY  (`subscriber_id`),
      UNIQUE KEY `subscriber_email` (`subscriber_email`)
    ) ENGINE=MyISAM CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' COMMENT='Subscribers for Comm are stored here.';

Если я добавлю следующее ниже оператора create table, то я не уверен, что произойдет, если столбец уже существует (и, возможно, заполнен):

ALTER TABLE `#__comm_subscribers` ADD `subscriber_surname`;
ALTER TABLE `#__comm_subscribers` MODIFY `subscriber_surname` varchar(64) NOT NULL default '';

Итак, я попробовал следующее, что нашел где-то. Кажется, это не работает, но я не совсем уверен, что использовал это правильно.

/*delimiter '//'
CREATE PROCEDURE addcol() BEGIN
IF NOT EXISTS(
SELECT * FROM information_schema.COLUMNS
WHERE COLUMN_NAME='subscriber_surname' AND TABLE_NAME='#__comm_subscribers'
)
THEN
    ALTER TABLE `#__comm_subscribers`
    ADD COLUMN `subscriber_surname` varchar(64) NOT NULL default '';
END IF;
END;
//
delimiter ';'
CALL addcol();
DROP PROCEDURE addcol;*/

У кого-нибудь есть хороший способ сделать это?

Ответы [ 15 ]

1 голос
/ 08 марта 2012

Если вы запускаете это в скрипте, вы захотите добавить следующую строку, чтобы сделать его повторно запускаемым, в противном случае вы получите ошибку процедуры, которая уже существует.

drop procedure foo;
1 голос
/ 09 июля 2010

Только что попробовал скрипт хранимой процедуры. Кажется, проблема заключается в отметках ' вокруг разделителей. Документы MySQL показывают, что символам-разделителям не нужны одинарные кавычки.

Итак, вы хотите:

delimiter //

Вместо:

delimiter '//'

У меня работает :) 1012 *

0 голосов
/ 13 мая 2017

Ниже представлена ​​хранимая процедура в MySQL для добавления столбцов в разных таблицах в разных базах данных, если столбец не существует в таблицах баз данных со следующими преимуществами

  • можно добавить несколько столбцов одновременно, чтобы изменить несколько таблиц в разных базах данных
  • три команды mysql выполняются, т.е. DROP, CREATE, CALL для процедуры
  • Имя базы данных должно меняться в соответствии с ИСПОЛЬЗОВАНИЕМ, в противном случае может возникнуть проблема с несколькими данными

DROP PROCEDURE  IF EXISTS `AlterTables`;
DELIMITER $$
CREATE PROCEDURE `AlterTables`() 
BEGIN
    DECLARE table1_column1_count INT;
    DECLARE table2_column2_count INT;
    SET table1_column1_count = (  SELECT COUNT(*) 
                    FROM INFORMATION_SCHEMA.COLUMNS
                    WHERE   TABLE_SCHEMA = 'DATABASE_NAME' AND
			    TABLE_NAME = 'TABLE_NAME1' AND 
                            COLUMN_NAME = 'TABLE_NAME1_COLUMN1');
    SET table2_column2_count = (  SELECT COUNT(*) 
                    FROM INFORMATION_SCHEMA.COLUMNS
                    WHERE   TABLE_SCHEMA = 'DATABASE_NAME' AND
			    TABLE_NAME = 'TABLE_NAME2' AND 
                            COLUMN_NAME = 'TABLE_NAME2_COLUMN2');
    IF table1_column1_count = 0 THEN
        ALTER TABLE `TABLE_NAME1`ADD `TABLE_NAME1_COLUMN1` text COLLATE 'latin1_swedish_ci' NULL AFTER `TABLE_NAME1_COLUMN3`,COMMENT='COMMENT HERE';
    END IF;
    IF table2_column2_count = 0 THEN
        ALTER TABLE `TABLE_NAME2` ADD `TABLE_NAME2_COLUMN2` VARCHAR( 100 ) NULL DEFAULT NULL COMMENT 'COMMENT HERE';
    END IF;
END $$
DELIMITER ;
call AlterTables();
0 голосов
/ 14 октября 2015
ALTER TABLE `subscriber_surname` ADD  IF NOT EXISTS  `#__comm_subscribers`.`subscriber_surname`;

ALTER TABLE `#__comm_subscribers` MODIFY `subscriber_surname` varchar(64) NOT NULL default '';
0 голосов
/ 06 сентября 2015
$smpt = $pdo->prepare("SHOW fields FROM __TABLE__NAME__");
$smpt->execute();
$res = $smpt->fetchAll(PDO::FETCH_ASSOC);
//print_r($res);

Тогда в $ res по циклу ищите ключ вашего столбца Что-то вроде этого:

    if($field['Field'] == '_my_col_'){
       return true;
    }
+

**Below code is good for checking column existing in the WordPress tables:**
public static function is_table_col_exists($table, $col)
    {
        global $wpdb;
        $fields = $wpdb->get_results("SHOW fields FROM {$table}", ARRAY_A);
        foreach ($fields as $field)
        {
            if ($field['Field'] == $col)
            {
                return TRUE;
            }
        }

        return FALSE;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...