Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Модули » Помогите решить проблему создания столбца в таблице при установке плагина?

Помогите решить проблему создания столбца в таблице при установке плагина?


     30.10.2023    Модули, MySQL    539

вопрос
Доброго врмени.

Пишу плагин, при установке которго должен добавляться столбец region_id в таблицу dle_post.
При первичной установке код ALTER TABLE `{prefix}_post` ADD `region_id` VARCHAR(190) DEFAULT NULL; работает нормально. Но если этот столбец уже добавлен ранее, то возникает ошибка, что столбец уже существует.

Пробовал такие варианты:
ALTER TABLE `{prefix}_post` ADD COLUMN IF NOT EXISTS `region_id` VARCHAR(190) DEFAULT NULL;
и
SELECT COUNT(*) FROM information_schema.columns WHERE table_name = '{prefix}_post' AND column_name = 'region_id';
ALTER TABLE `{prefix}_post` ADD `region_id` VARCHAR(190) DEFAULT NULL;
но они не помогли.
Удалять столбец region_id при удалении плагина нельзя.

Ответа пока нет


8 комментариев

web102
Юзер

web102 - 30 октября 2023 10:47 -

Влпрос решен. Вдруг кому пригодится решение:
При установке плагина выполнять php-код:
$result = $db->query("SHOW COLUMNS FROM ".PREFIX."_post WHERE Field = 'region_id'");
if(!$result->num_rows) $db->query("ALTER TABLE ".PREFIX."_post ADD `region_id` VARCHAR(190) DEFAULT NULL");
$db->close();

lutskboy
Эксперт

lutskboy - 30 октября 2023 13:53 -

тоже думал над таким вопросом. стыкался не раз с этим. и пришел к выводу что через mysql это не получится и нужно на php делать
а потом и вовсе забил на это. просто не обращаю на ету ошибку внимание. так же и клиентам говорю. очищайте мол и все. может и на mysql можно через if но не стал заморачиваться

dj-avtosh
PHP-developer

dj-avtosh - 30 октября 2023 18:01 -

Первое утверждение из вопроса вполне будет работать на MariaDB, на обычном мускуле скорее всего нужно делать через процедуру.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

SX2
Эксперт

SX2 - 30 октября 2023 18:26 -

Как-то так
DROP PROCEDURE IF EXISTS RegionID;
DELIMITER //
CREATE PROCEDURE RegionID()
BEGIN
  IF NOT EXISTS (
    SELECT * FROM information_schema.columns
    WHERE table_name = 'dle_post' AND column_name = 'region_id'
  ) THEN
    ALTER TABLE `dle_post` ADD `region_id` VARCHAR(190) DEFAULT NULL;
  END IF;
END //
DELIMITER ;
CALL RegionID();

Самая сложная часть работы – решиться приступить к ней.

dj-avtosh
PHP-developer

dj-avtosh - 30 октября 2023 18:40 -

В pdo бы сработало так, в нативном mysql мне негде проверять:

SET @preparedStatement = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (table_name = "{prefix}_post")
      AND (table_schema = DATABASE())
      AND (column_name = "region_id")
  ) > 0,
  "SELECT 1",
  CONCAT("ALTER TABLE ", "{prefix}_post", " ADD ", "region_id", " VARCHAR(190) DEFAULT NULL;")
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 30 октября 2023 18:57 -

Прошу прощения за пачку сообщений, посмотрел под капот движка. Там выполняется multi_query, так что вот это должно сработать все же:


SET @preparedStatement = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (table_name = "{prefix}_post")
      AND (table_schema = DATABASE())
      AND (column_name = "region_id")
  ) > 0,
  "SELECT 1",
  CONCAT("ALTER TABLE ", "{prefix}_post", " ADD ", "region_id", " VARCHAR(190) DEFAULT NULL;")
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

web102
Юзер

web102 - 30 октября 2023 19:23 -

dj-avtosh, а какой вариант предпочтительнее, на php или ваш, с использованием процедур?

dj-avtosh
PHP-developer

dj-avtosh - 30 октября 2023 19:37 -

у меня без процедуры, у меня со связанными переменными. Скорее всего логичным является мой, т.к. не всегда юзеру базы данных разрешены создания процедур.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх