Функция DBDELTA() в WordPress: использование и советы

# Функция 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, обеспечивая при этом точность информации.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *