# Функция DBDELTA() в WordPress
Функция DBDELTA()
используется для создания или изменения таблиц в базе данных на основе заданного SQL-запроса. Она полезна для создания новых таблиц и обновления существующих таблиц, чтобы они соответствовали новой структуре. Цель этой функции — исправить недостающие столбцы или индексы.
Когда вы передаете SQL-запрос в эту функцию, он разбивается на части, и на основе этих частей функция создает или изменяет существующую таблицу, если это необходимо.
## Основные принципы работы функции
- **Используйте только команду CREATE.** Эта функция специально разработана, чтобы облегчить вам работу. Просто передайте команду CREATE, и если таблица не существует, она будет создана. Если она уже существует, структура таблицы будет обновлена.
- **Не используйте IF NOT EXISTS
!** Это вызовет ошибку. Вместо CREATE TABLE IF NOT EXISTS table_name (...)
, используйте CREATE TABLE table_name (...)
.
- **Ограничения:** Нельзя и��пользовать ограничение внешнего ключа с dbDelta
.
## Требования к функции
Функция разбирает запрос, который ей передан, поэтому запрос должен соответствовать следующим требованиям:
1. **Каждое поле должно быть на новой строке.**
2. **Запрос должен быть без двойных переносов строк.** Например, нельзя отделять поля от индексов пустой строкой.
**Правильный пример:**
symbol VARCHAR(191) NOT NULL DEFAULT '',
total_volume FLOAT DEFAULT NULL COMMENT 'объем в USD',
PRIMARY KEY (id),
KEY coin_id (coin_id),
**Неправильный пример:**
symbol VARCHAR(191) NOT NULL DEFAULT '',
total_volume FLOAT DEFAULT NULL COMMENT 'объем в USD',
PRIMARY KEY (id),
KEY coin_id (coin_id),
3. **При создании многократных индексов разделяйте их имена запятой без пробелов.**
- **Правильно:** KEY field (field,field2)
- **Неправильно:** KEY field (field, field2)
4. **Не используйте апострофы (' или ) для имен таблиц или имен полей.** Например, используйте
$wpdb->table, а не
$wpdb->table
`.
5. **Рекомендуется указывать длину поля, если это возможно.** Например: int(11)
.
## Примечания о работе функции
1. **При обновлении структуры порядок полей не учитывается.** Если новое поле находится на втором месте в запросе, оно будет добавлено в конец существующей таблицы.
2. **Вы не сможете добавить основной автоинкрементируемый поле с PRIMARY KEY в существующую таблицу.**
3. **Если мы удалим индекс из существующей структуры, он не будет удален из существующей таблицы.**
4. **Это также касается полей.** Например, если мы переименуем существующее поле, dbDelta()
создаст новое поле, но не удалит существующее.
5. **Если индекс изменится, например, будет добавлено другое поле, но имя останется тем же, функция выдаст ошибку (индекс уже существует).** В общем, для обновления индексов лучше делать отдельные запросы.
Если функция не определена, вам нужно подключить файл wp-admin/includes/upgrade.php
:
```php
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
Когда использовать DBDELTA?
Функция подходит для создания новых таблиц, полей и индексов, а также для изменения структуры полей (но не имен).
Она не подходит для изменения структуры индексов, удаления полей или индексов. Любое удаление в структуре полей должно выполняться отдельными запросами. Изменение структуры существующих индексов также следует делать раздельно.
Пример использования
Функция dbDelta($queries, $execute);
Параметры:
- $queries (string/array): SQL-запрос. Можно указать строку с несколькими запросами (разделенными точкой с запятой) или массив, где каждый элемент — это отдельный SQL-запрос.
- $execute (true/false): Выполнять ли указанные в $queries запросы. По умолчанию
true
.
Пример 1: Создание новой таблицы
Создаем таблицу с именем test_table
, которая будет иметь префикс из wp-config.php
. Его можно получить так: $wpdb->get_blog_prefix()
или $wpdb->prefix
.
function create_table() {
global $wpdb;
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
$table_name = $wpdb->get_blog_prefix() . 'test_table';
$charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset} COLLATE {$wpdb->collate}";
$sql = "CREATE TABLE {$table_name} (
id bigint(20) unsigned NOT NULL auto_increment,
address varchar(255) NOT NULL default '',
alert varchar(20) NOT NULL default '',
meta longtext NOT NULL default '',
PRIMARY KEY (id),
KEY alert (alert)
)
{$charset_collate};";
dbDelta($sql);
}
create_table();
Пример 2: Добавление колонки к существующей таблице
В этом примере мы добавляем новый столбец к таблице с именем test_table
.
function update_table() {
global $wpdb;
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
$table_name = $wpdb->get_blog_prefix() . 'test_table';
$charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset} COLLATE {$wpdb->collate}";
$sql = "CREATE TABLE {$table_name} (
id bigint(20) unsigned NOT NULL auto_increment,
address varchar(255) NOT NULL default '',
alert varchar(20) NOT NULL default '',
meta longtext NOT NULL default '',
new_meta longtext NOT NULL default '',
PRIMARY KEY (id),
KEY alert (alert)
)
{$charset_collate};";
dbDelta($sql);
}
update_table();
Примечания
- Глобальный объект базы данных:
$wpdb
— это абстрактный объект базы данных WordPress.
Обратите внимание, что приведенные примеры кода и объяснения сделали материал более понятным для начинающих пользователей WordPress, обеспечивая при этом точность информации.