Синтаксис ALTER TABLE для dbDelta?
Из-за изменений в базе данных мне нужно изменить таблицу, добавив в нее один столбец, но хотя функция выполняется, таблица не изменяется. Вот код ALTER TABLE, который я написал:
$sql = "ALTER TABLE " . $packagetable . " ADD COLUMN price decimal(14,2) NOT NULL AFTER description;";
dbDelta($sql);
Я не смог найти синтаксис ALTER TABLE для dbDelta в интернете. РЕДАКТИРОВАНО: Посмотрев оператор ALTER TABLE в плагине Gravity Forms, я обновил запрос в одну строку.

Вы использовали функцию dbDelta
неправильно.
Основная цель этой функции — передача SQL-команды для создания таблицы.
Если таблицы не существует, она будет создана.
Если таблица существует, но не соответствует структуре, она будет изменена до совпадения. Это включает добавление и обновление столбцов, индексов и других аспектов.
Поэтому вам нужно запустить dbDelta и передать SQL для создания таблицы, а не для её изменения.
Смотрите здесь, что говорит Codex о добавлении обновления/изменения таблицы с использованием dbDelta
Но это ещё не всё! Функция dbDelta очень привередлива — вы не можете просто вставить любой SQL-запрос, он должен быть правильно отформатирован.
Вот что говорится в Codex на той же странице:
- Каждое поле должно быть на отдельной строке в вашем SQL-запросе.
- Между словами PRIMARY KEY и определением первичного ключа должно быть два пробела.
- Вы должны использовать ключевое слово KEY вместо его синонима INDEX, и должен быть указан хотя бы один KEY.
- Не используйте кавычки или обратные апострофы вокруг названий полей.
И из другого источника:
Функция dbDelta
Как я упоминал ранее в одной из своих статей, функция dbDelta может анализировать текущую структуру таблицы, сравнивать её с желаемой структурой и при необходимости добавлять или изменять таблицу. Это делает её очень удобной для обновлений нашего плагина. Однако, в отличие от многих функций WordPress, dbDelta — самая привередливая и проблемная. Чтобы она работала, необходимо соблюсти несколько условий.
- Каждое поле должно быть на отдельной строке в SQL-запросе.
- Между словами PRIMARY KEY и определением первичного ключа должно быть два пробела.
- Вы должны использовать ключевое слово KEY вместо INDEX и указать хотя бы один KEY.
Эти условия кажутся лёгкими для выполнения, но подождите, пока вы с ними не столкнётесь.

dbDelta()
поддерживает добавление и обновление столбцов. Смотрите: http://wordpress.stackexchange.com/q/76926/19726

Я не говорил, что это не так, я просто сказал, что его подход был неправильным. Используйте оператор CREATE для таблицы, которую вы хотите, а не ALTER, и dbDelta создаст для вас столбцы и изменит таблицу, пока она не будет соответствовать SQL-запросу

Итак, я обновил SQL-запрос, чтобы добавить колонку с ценой, но получил ошибку БД о том, что таблица уже существует. Вот сообщение об ошибке WordPress database error: [Table 'wp_booking_packages' already exists]
CREATE TABLE wp_booking_packages( id mediumint(9) NOT NULL AUTO_INCREMENT, name text NOT NULL, description text NOT NULL, price decimal(14,2) NOT NULL, city1 text NOT NULL, city2 text NOT NULL, PRIMARY KEY (id) )
и я проверил в консоли MySQL, что колонка всё ещё не существует.

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

http://gist.github.com если вы не знакомы с этим сервисом

Вот гист https://gist.github.com/4482802

@TomJNowell Что если у меня есть поле в операторе CREATE TABLE с типом данных TEXT, и теперь я хочу изменить тип данных этого поля на BIGINT, в этом случае dbDelta не срабатывает. Есть ли способ это сделать?

@IAmDhar как я могу преобразовать слово "banana" в число? Я бы задал это как совершенно новый вопрос, вряд ли у кого-то есть ответ, и есть большая вероятность, что это выходит за рамки возможностей dbDelta (dbDelta изменит колонку, но не изменит сами данные)

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

Чтобы добавить столбец в таблицу базы данных WordPress, можно использовать $wpdb
:
global $wpdb;
$table = $wpdb->prefix . 'my_table';
$sql = "ALTER TABLE `{$table}`
ADD `new_column` VARCHAR(20) NULL DEFAULT NULL;";
$query_result = $wpdb->query( $sql );
Метод $wpdb->query()
возвращает false, если запрос выполнился с ошибкой, согласно документации метода. Поэтому можно написать условие if-else для обработки успешного выполнения или ошибки:
if ( $query_result === false ){
// произошла ошибка
} else {
// успех
}
Если нужно добавить новый столбец после определенного столбца, используйте AFTER
в запросе:
$sql = "ALTER TABLE `{$table}`
ADD `new_column` VARCHAR(20) NULL DEFAULT NULL
AFTER `exist_column`;";
Также можно изменить существующий столбец
$sql = "ALTER TABLE `{$table}`
MODIFY COLUMN `exist_column` VARCHAR(20) NULL DEFAULT NULL;";
или удалить его
$sql = "ALTER TABLE `{$table}`
DROP COLUMN `exist_column`;";
Небольшой совет: В PHP внутри двойных кавычек ("
) можно использовать переменные в фигурных скобках ("foo {$var} bar"
) или без них ("foo $var bar"
) для вставки переменных в строку, вместо конкатенации ("foo " . $var . " bar"
). В примерах выше я использовал этот способ. Подробнее о парсинге строк в PHP.
