Версія фреймворка: 8.x

База даних: Міграції

Вступ

Міграції - це як контроль версій для вашої бази даних, що дозволяє вашій команді змінювати та надавати спільний доступ до схеми бази даних програми. Міграції, як правило, поєднуються з конструктором схем Laravel для побудови схеми бази даних вашої програми. Якщо вам коли-небудь доводилося казати товаришу по команді вручну додати стовпець до їх локальної схеми бази даних, ви зіткнулися з проблемою, яку вирішує міграція бази даних.

ЛаравельSchemaфасаднадає агностичну підтримку баз даних для створення та обробки таблиць у всіх підтримуваних системах баз даних Laravel.

Генерування міграцій

Щоб створити міграцію, використовуйтеmake:migrationArtisan командування:

php artisan make:migration create_users_table

Нова міграція буде розміщена у вашомуdatabase/migrationsкаталог. Кожне ім'я файлу міграції містить мітку часу, що дозволяє Laravel визначати порядок міграцій.

Заглушки міграції можна налаштувати за допомогоюзаглушка видавництва

--tableі--createПараметри також можуть використовуватися для вказівки назви таблиці та того, чи буде міграція створювати нову таблицю. Ці параметри попередньо заповнюють згенерований файл заглушки вказаною таблицею:

php artisan make:migration create_users_table --create=users

php artisan make:migration add_votes_to_users_table --table=users

Якщо ви хочете вказати власний вихідний шлях для згенерованої міграції, ви можете використовувати--pathпараметр при виконанніmake:migrationкоманди. Вказаний шлях повинен бути відносно базового шляху вашої програми.

Міграція, що стискає

Створюючи додаток, з часом ви можете накопичувати все більше і більше міграцій. Це може призвести до того, що ваш каталог міграції роздується потенційно сотнями міграцій. Якщо ви хочете, ви можете "зім'яти" свої міграції в один файл SQL. Для початку виконайтеschema:dumpкоманда:

php artisan schema:dump

// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune

Коли ви виконуєте цю команду, Laravel напише файл "schema" на вашdatabase/schemaкаталог. Тепер, коли ви намагаєтесь перенести вашу базу даних і жодної іншої міграції не було виконано, Laravel спочатку виконає SQL-файл файлу схеми. Після виконання команд файлу схеми Laravel виконає всі залишені міграції, які не були частиною дампа схеми.

Вам слід закріпити файл схеми бази даних для керування джерелом, щоб інші нові розробники у вашій команді могли швидко створити початкову структуру бази даних вашого додатка.

Зменшення міграції доступне лише для баз даних MySQL, PostgreSQL та SQLite. Однак дампи бази даних не можуть бути відновлені до баз даних SQLite в пам'яті.

Структура міграції

Клас міграції містить два методи:upіdown.upметод використовується для додавання нових таблиць, стовпців або індексів до вашої бази даних, тоді якdownметод повинен змінити операції, що виконуютьсяupметод.

В обох цих методах ви можете використовувати конструктор схем Laravel для виразного створення та модифікації таблиць. Щоб дізнатись про всі методи, доступні наSchemaбудівельник,ознайомтесь з його документацією. Наприклад, наступна міграція створює файлflightsстіл:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateFlightsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('airline');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('flights');
    }
}

Запуск міграцій

Щоб запустити всі ваші видатні міграції, запустітьmigrateКоманда ремісників:

php artisan migrate
Якщо ви використовуєтеВіртуальна машина Homestead, вам слід запустити цю команду з віртуальної машини.

Примушування міграцій до виробництва

Деякі операції міграції є руйнівними, а це означає, що вони можуть призвести до втрати даних. Щоб захистити вас від запуску цих команд проти вашої виробничої бази даних, перед виконанням команд вам буде запропоновано підтвердити. Щоб змусити команди запускатись без підказки, використовуйте--forceпрапор:

php artisan migrate --force

Відкочування міграцій

Щоб повернути останню операцію міграції, ви можете використовуватиrollbackкоманди. Ця команда відкочує останню "партію" міграцій, яка може включати кілька файлів міграції:

php artisan migrate:rollback

Ви можете відкотити обмежену кількість міграцій, надавшиstepваріант дляrollbackкоманди. Наприклад, наступна команда відкотить останні п’ять міграцій:

php artisan migrate:rollback --step=5

migrate:resetкоманда відкотить усі міграції програми:

php artisan migrate:reset

Відкат і перехід за допомогою однієї команди

migrate:refreshкоманда відкотить усі ваші міграції, а потім виконаєmigrateкоманди. Ця команда ефективно відтворює всю вашу базу даних:

php artisan migrate:refresh

// Refresh the database and run all database seeds...
php artisan migrate:refresh --seed

Ви можете відкотитись і повторно перенести обмежену кількість міграцій, надавшиstepваріант дляrefreshкоманди. Наприклад, наступна команда відкотить і повторно мігрує останні п’ять міграцій:

php artisan migrate:refresh --step=5

Відкиньте всі таблиці та перенесіть

migrate:freshкоманда видалить усі таблиці з бази даних, а потім виконаєmigrateкоманда:

php artisan migrate:fresh

php artisan migrate:fresh --seed
migrate:freshкоманда скине всі таблиці бази даних незалежно від їх префікса. Цю команду слід застосовувати з обережністю при розробці бази даних, спільно використовуваної з іншими програмами.

Столи

Створення таблиць

Щоб створити нову таблицю бази даних, використовуйтеcreateметод наSchemaфасад.createметод приймає два аргументи: перший - це назва таблиці, а другий - aClosureякий отримує aBlueprintоб'єкт, який може бути використаний для визначення нової таблиці:

Schema::create('users', function (Blueprint $table) {
    $table->id();
});

Створюючи таблицю, ви можете використовувати будь-яку з конструкторів схемколонкові методидля визначення стовпців таблиці.

Перевірка наявності таблиці / стовпця

Ви можете перевірити наявність таблиці або стовпця за допомогоюhasTableіhasColumnметоди:

if (Schema::hasTable('users')) {
    //
}

if (Schema::hasColumn('users', 'email')) {
    //
}

Параметри підключення до бази даних та таблиці

Якщо ви хочете виконати операцію схеми з підключенням до бази даних, яке не є вашим з'єднанням за замовчуванням, використовуйтеconnectionметод:

Schema::connection('foo')->create('users', function (Blueprint $table) {
    $table->id();
});

Ви можете використовувати такі команди у конструкторі схем для визначення параметрів таблиці:

Команда Опис
$table->engine = 'InnoDB'; Вкажіть механізм зберігання таблиць (MySQL).
$table->charset = 'utf8mb4'; Вкажіть набір символів за замовчуванням для таблиці (MySQL).
$table->collation = 'utf8mb4_unicode_ci'; Вкажіть порівняння за замовчуванням для таблиці (MySQL).
$table->temporary(); Створіть тимчасову таблицю (крім SQL Server).

Перейменування / скидання таблиць

Щоб перейменувати існуючу таблицю бази даних, використовуйтеrenameметод:

Schema::rename($from, $to);

Щоб скинути існуючу таблицю, ви можете використовуватиdropабоdropIfExistsметоди:

Schema::drop('users');

Schema::dropIfExists('users');

Перейменування таблиць за допомогою іноземних ключів

Перш ніж перейменовувати таблицю, слід переконатися, що будь-які обмеження зовнішнього ключа в таблиці мають явне ім'я у файлах міграції, замість того, щоб дозволяти Laravel присвоювати ім'я на основі конвенції. В іншому випадку ім’я обмеження зовнішнього ключа буде посилатися на старе ім’я таблиці.

Стовпці

Створення стовпців

tableметод наSchemaфасад може використовуватися для оновлення існуючих таблиць. Подобаєтьсяcreateметод,tableметод приймає два аргументи: ім'я таблиці та aClosureщо отримує aBlueprintекземпляр, який ви можете використовувати для додавання стовпців до таблиці:

Schema::table('users', function (Blueprint $table) {
    $table->string('email');
});

Доступні типи стовпців

Command Description
$table->id(); Alias of $table->bigIncrements('id').
$table->foreignId('user_id'); Alias of $table->unsignedBigInteger('user_id').
$table->bigIncrements('id'); Auto-incrementing UNSIGNED BIGINT (primary key) equivalent column.
$table->bigInteger('votes'); BIGINT equivalent column.
$table->binary('data'); BLOB equivalent column.
$table->boolean('confirmed'); BOOLEAN equivalent column.
$table->char('name', 100); CHAR equivalent column with a length.
$table->date('created_at'); DATE equivalent column.
$table->dateTime('created_at', 0); DATETIME equivalent column with precision (total digits).
$table->dateTimeTz('created_at', 0); DATETIME (with timezone) equivalent column with precision (total digits).
$table->decimal('amount', 8, 2); DECIMAL equivalent column with precision (total digits) and scale (decimal digits).
$table->double('amount', 8, 2); DOUBLE equivalent column with precision (total digits) and scale (decimal digits).
$table->enum('level', ['easy', 'hard']); ENUM equivalent column.
$table->float('amount', 8, 2); FLOAT equivalent column with a precision (total digits) and scale (decimal digits).
$table->geometry('positions'); GEOMETRY equivalent column.
$table->geometryCollection('positions'); GEOMETRYCOLLECTION equivalent column.
$table->increments('id'); Auto-incrementing UNSIGNED INTEGER (primary key) equivalent column.
$table->integer('votes'); INTEGER equivalent column.
$table->ipAddress('visitor'); IP address equivalent column.
$table->json('options'); JSON equivalent column.
$table->jsonb('options'); JSONB equivalent column.
$table->lineString('positions'); LINESTRING equivalent column.
$table->longText('description'); LONGTEXT equivalent column.
$table->macAddress('device'); MAC address equivalent column.
$table->mediumIncrements('id'); Auto-incrementing UNSIGNED MEDIUMINT (primary key) equivalent column.
$table->mediumInteger('votes'); MEDIUMINT equivalent column.
$table->mediumText('description'); MEDIUMTEXT equivalent column.
$table->morphs('taggable'); Adds taggable_id UNSIGNED BIGINT and taggable_type VARCHAR equivalent columns.
$table->uuidMorphs('taggable'); Adds taggable_id CHAR(36) and taggable_type VARCHAR(255) UUID equivalent columns.
$table->multiLineString('positions'); MULTILINESTRING equivalent column.
$table->multiPoint('positions'); MULTIPOINT equivalent column.
$table->multiPolygon('positions'); MULTIPOLYGON equivalent column.
$table->nullableMorphs('taggable'); Adds nullable versions of morphs() columns.
$table->nullableUuidMorphs('taggable'); Adds nullable versions of uuidMorphs() columns.
$table->nullableTimestamps(0); Alias of timestamps() method.
$table->point('position'); POINT equivalent column.
$table->polygon('positions'); POLYGON equivalent column.
$table->rememberToken(); Adds a nullable remember_token VARCHAR(100) equivalent column.
$table->set('flavors', ['strawberry', 'vanilla']); SET equivalent column.
$table->smallIncrements('id'); Auto-incrementing UNSIGNED SMALLINT (primary key) equivalent column.
$table->smallInteger('votes'); SMALLINT equivalent column.
$table->softDeletes('deleted_at', 0); Adds a nullable deleted_at TIMESTAMP equivalent column for soft deletes with precision (total digits).
$table->softDeletesTz('deleted_at', 0); Adds a nullable deleted_at TIMESTAMP (with timezone) equivalent column for soft deletes with precision (total digits).
$table->string('name', 100); VARCHAR equivalent column with a length.
$table->text('description'); TEXT equivalent column.
$table->time('sunrise', 0); TIME equivalent column with precision (total digits).
$table->timeTz('sunrise', 0); TIME (with timezone) equivalent column with precision (total digits).
$table->timestamp('added_on', 0); TIMESTAMP equivalent column with precision (total digits).
$table->timestampTz('added_on', 0); TIMESTAMP (with timezone) equivalent column with precision (total digits).
$table->timestamps(0); Adds nullable created_at and updated_at TIMESTAMP equivalent columns with precision (total digits).
$table->timestampsTz(0); Adds nullable created_at and updated_at TIMESTAMP (with timezone) equivalent columns with precision (total digits).
$table->tinyIncrements('id'); Auto-incrementing UNSIGNED TINYINT (primary key) equivalent column.
$table->tinyInteger('votes'); TINYINT equivalent column.
$table->unsignedBigInteger('votes'); UNSIGNED BIGINT equivalent column.
$table->unsignedDecimal('amount', 8, 2); UNSIGNED DECIMAL equivalent column with a precision (total digits) and scale (decimal digits).
$table->unsignedInteger('votes'); UNSIGNED INTEGER equivalent column.
$table->unsignedMediumInteger('votes'); UNSIGNED MEDIUMINT equivalent column.
$table->unsignedSmallInteger('votes'); UNSIGNED SMALLINT equivalent column.
$table->unsignedTinyInteger('votes'); UNSIGNED TINYINT equivalent column.
$table->uuid('id'); UUID equivalent column.
$table->year('birth_year'); YEAR equivalent column.

Модифікатори стовпців

На додаток до перерахованих вище типів стовпців, є кілька "модифікаторів" стовпців, які ви можете використовувати під час додавання стовпця до таблиці бази даних. Наприклад, щоб зробити стовпець "нульовим", ви можете використовуватиnullableметод:

Schema::table('users', function (Blueprint $table) {
    $table->string('email')->nullable();
});

Наступний список містить усі доступні модифікатори стовпців. Цей список не включаємодифікатори індексу:

Modifier Description
->after('column') Place the column "after" another column (MySQL)
->autoIncrement() Set INTEGER columns as auto-increment (primary key)
->charset('utf8mb4') Specify a character set for the column (MySQL)
->collation('utf8mb4_unicode_ci') Specify a collation for the column (MySQL/PostgreSQL/SQL Server)
->comment('my comment') Add a comment to a column (MySQL/PostgreSQL)
->default($value) Specify a "default" value for the column
->first() Place the column "first" in the table (MySQL)
->from($integer) Set the starting value of an auto-incrementing field (MySQL / PostgreSQL)
->nullable($value = true) Allows (by default) NULL values to be inserted into the column
->storedAs($expression) Create a stored generated column (MySQL)
->unsigned() Set INTEGER columns as UNSIGNED (MySQL)
->useCurrent() Set TIMESTAMP columns to use CURRENT_TIMESTAMP as default value
->useCurrentOnUpdate() Set TIMESTAMP columns to use CURRENT_TIMESTAMP when a record is updated
->virtualAs($expression) Create a virtual generated column (MySQL)
->generatedAs($expression) Create an identity column with specified sequence options (PostgreSQL)
->always() Defines the precedence of sequence values over input for an identity column (PostgreSQL)

Вирази за замовчуванням

defaultмодифікатор приймає значення або\Illuminate\Database\Query\Expressionінстанції. ВикористанняExpressionекземпляр запобіжить загортанню значення у лапки та дозволить використовувати спеціальні функції бази даних. Одна ситуація, коли це особливо корисно, це коли вам потрібно призначити значення за замовчуванням стовпцям JSON:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Query\Expression;
use Illuminate\Database\Migrations\Migration;

class CreateFlightsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->json('movies')->default(new Expression('(JSON_ARRAY())'));
            $table->timestamps();
        });
    }
}
Підтримка виразів за замовчуванням залежить від драйвера бази даних, версії бази даних та типу поля. Будь ласка, зверніться до відповідної документації щодо сумісності. Також зауважте, що використання певних функцій бази даних може щільно поєднати вас із певним драйвером.

Змінення стовпців

Передумови

Перш ніж змінювати стовпець, обов’язково додайтеdoctrine/dbalзалежність від вашогоcomposer.jsonфайл. Бібліотека DBAL Doctrine використовується для визначення поточного стану стовпця та створення запитів SQL, необхідних для внесення необхідних коригувань:

composer require doctrine/dbal

Оновлення атрибутів стовпців

changeметод дозволяє змінювати тип та атрибути існуючих стовпців. Наприклад, ви можете збільшити розмір astringстовпець. Щоб побачитиchangeв дії, давайте збільшимо розмірname column from 25 to 50:

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->change();
});

Ми також можемо змінити стовпець, щоб його можна було опустити:

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->nullable()->change();
});
Можна змінити лише такі типи стовпців: bigInteger, двійкові, логічні, дата, dateTime, dateTimeTz, десяткове, ціле число, json, longText, mediumText, smallInteger, рядок, текст, час, unsignedBigInteger, unsignedInteger, unsignedSmallInteger і uuid.

Перейменування стовпців

Щоб перейменувати стовпець, ви можете використовуватиrenameColumnу конструкторі схем. Перш ніж перейменовувати стовпець, обов’язково додайтеdoctrine/dbalзалежність від вашогоcomposer.jsonфайл:

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});
ПерейменуванняenumНа даний момент стовпець не підтримується.

Скидання стовпців

Щоб скинути стовпець, використовуйтеdropColumnу конструкторі схем. Перш ніж скидати стовпці з бази даних SQLite, вам потрібно додати файлdoctrine/dbalзалежність від вашогоcomposer.jsonфайл і запустітьcomposer updateкоманда у вашому терміналі для встановлення бібліотеки:

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('votes');
});

Ви можете скинути кілька таблиць із таблиці, передавши масив імен стовпців доdropColumnметод:

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn(['votes', 'avatar', 'location']);
});
Видалення або зміна кількох стовпців у межах однієї міграції під час використання бази даних SQLite не підтримується.

Доступні псевдоніми команд

Command Description
$table->dropMorphs('morphable'); Drop the morphable_id and morphable_type columns.
$table->dropRememberToken(); Drop the remember_token column.
$table->dropSoftDeletes(); Drop the deleted_at column.
$table->dropSoftDeletesTz(); Alias of dropSoftDeletes() method.
$table->dropTimestamps(); Drop the created_at and updated_at columns.
$table->dropTimestampsTz(); Alias of dropTimestamps() method.

Indexes

Створення індексів

Конструктор схем Laravel підтримує кілька типів індексів. Наступний приклад створює новийemailі вказує, що його значення повинні бути унікальними. Для створення індексу ми можемо встановити ланцюжокuniqueметод до визначення стовпця:

$table->string('email')->unique();

Крім того, ви можете створити індекс після визначення стовпця. Наприклад:

$table->unique('email');

Ви навіть можете передати масив стовпців методу індексу для створення складеного (або складеного) індексу:

$table->index(['account_id', 'created_at']);

Laravel автоматично генерує ім'я індексу на основі таблиці, імен стовпців та типу індексу, але ви можете передати другий аргумент методу, щоб вказати ім'я індексу самостійно:

$table->unique('email', 'unique_email');

Доступні типи індексів

Кожен метод індексу приймає необов’язковий другий аргумент, щоб вказати ім’я індексу. Якщо його не вказати, ім’я буде отримано з назв таблиці та стовпців, що використовуються для індексу, а також типу індексу.

Команда Опис
$table->primary('id'); Додає первинний ключ.
$table->primary(['id', 'parent_id']); Додає складені клавіші.
$table->unique('email'); Додає унікальний індекс.
$table->index('state'); Додає звичайний індекс.
$table->spatialIndex('location'); Додає просторовий індекс. (крім SQLite)

Довжини індексу & MySQL / MariaDB

Laravel використовуєutf8mb4набір символів за замовчуванням, що включає підтримку зберігання "смайликів" у базі даних. Якщо у вас запущена версія MySQL, старша за версію 5.7.7 або MariaDB, старша за версію 10.2.2, можливо, вам доведеться вручну налаштувати довжину рядка за замовчуванням, що генерується міграціями, щоб MySQL створював для них індекси. Ви можете налаштувати це, зателефонувавши доSchema::defaultStringLengthметод у вашомуAppServiceProvider:

use Illuminate\Support\Facades\Schema;

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191);
}

Ви також можете ввімкнутиinnodb_large_prefixваріант для вашої бази даних. Зверніться до документації вашої бази даних, щоб отримати інструкції щодо того, як правильно увімкнути цю опцію.

Перейменування покажчиків

Щоб перейменувати індекс, ви можете використовуватиrenameIndexметод. Цей метод приймає поточне ім'я індексу як перший аргумент, а бажане нове ім'я як другий аргумент:

$table->renameIndex('from', 'to')

Падіння індексів

Щоб скинути індекс, потрібно вказати його назву. За замовчуванням Laravel автоматично призначає ім'я індексу на основі імені таблиці, імені індексованого стовпця та типу індексу. Ось кілька прикладів:

Команда Опис
$table->dropPrimary('users_id_primary'); Видаліть первинний ключ із таблиці "користувачі".
$table->dropUnique('users_email_unique'); Видаліть унікальний індекс із таблиці "користувачі".
$table->dropIndex('geo_state_index'); Видаліть основний індекс із таблиці "geo".
$table->dropSpatialIndex('geo_location_spatialindex'); Видаліть просторовий індекс із таблиці "geo" (крім SQLite).

Якщо ви передаєте масив стовпців у метод, який скидає індекси, звичайне ім'я індексу буде сформовано на основі імені таблиці, стовпців і типу ключа:

Schema::table('geo', function (Blueprint $table) {
    $table->dropIndex(['state']); // Drops index 'geo_state_index'
});

Зовнішні ключові обмеження

Laravel також надає підтримку для створення обмежень зовнішнього ключа, які використовуються для примусу посилальної цілісності на рівні бази даних. Наприклад, визначимо auser_idна стовпціpostsтаблиця, яка посилається наidстовпець на ausersстіл:

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});

Оскільки цей синтаксис досить багатослівний, Laravel пропонує додаткові, строгіші методи, які використовують конвенцію, щоб забезпечити кращий досвід для розробників. Приклад вище можна написати так:

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
});

foreignIdметод є псевдонімом дляunsignedBigIntegerв той час якconstrainedметод буде використовувати конвенцію для визначення імені таблиці та стовпця, на яку посилаються. Якщо назва вашої таблиці не відповідає умовам, ви можете вказати назву таблиці, передавши її як аргумент доconstrainedметод:

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained('users');
});

Ви також можете вказати бажану дію для властивостей обмеження "при видаленні" та "при оновленні":

$table->foreignId('user_id')
      ->constrained()
      ->onDelete('cascade');

Будь-які додатковімодифікатори стовпцівпотрібно дзвонити ранішеconstrained:

$table->foreignId('user_id')
      ->nullable()
      ->constrained();

Щоб випустити зовнішній ключ, ви можете використовуватиdropForeignметод, передаючи обмеження зовнішнього ключа, яке буде видалено як аргумент. Обмеження зовнішнього ключа використовують те саме правило іменування, що і індекси, на основі імені таблиці та стовпців у обмеженні, після чого "_іноземний "суфікс:

$table->dropForeign('posts_user_id_foreign');

Крім того, ви можете передати масив, що містить ім'я стовпця, що містить зовнішній ключ доdropForeignметод. Масив буде автоматично перетворений, використовуючи дозвіл імені обмеження, використовуваний конструктором схем Laravel:

$table->dropForeign(['user_id']);

Ви можете ввімкнути або вимкнути обмеження зовнішнього ключа в рамках своїх міграцій, використовуючи такі методи:

Schema::enableForeignKeyConstraints();

Schema::disableForeignKeyConstraints();
SQLite за замовчуванням вимикає обмеження зовнішнього ключа. Використовуючи SQLite, обов’язковоувімкнути підтримку зовнішнього ключау конфігурації бази даних перед спробою створити їх під час міграції. Крім того, SQLite підтримує зовнішні ключі лише при створенні таблиці тане при зміні таблиць.