← Cloudflare D1 / d1 / sql-api
SQL-операторы
D1 совместим с большинством соглашений SQL в SQLite, поскольку использует движок запросов SQLite. D1 поддерживает ряд операторов уровня базы данных, которые позволяют получать список таблиц и индексов, а также просматривать схему указанной таблицы или индекса.
Любой из этих операторов можно выполнить через консоль D1 в панели управления Cloudflare, wrangler d1 execute, либо с D1 Worker Bindings API.
Поддерживаемые расширения SQLite
D1 поддерживает подмножество расширений SQLite для дополнительной функциональности, включая:
- Модуль FTS5 ↗ для полнотекстового поиска (включая
fts5vocab). - Расширение JSON ↗ документацию по функциям и операторам JSON.
- Математические функции ↗.
См. исходный код ↗ с полным списком поддерживаемых функций.
Поддерживаемые инструкции PRAGMA
D1 поддерживает некоторые SQLite PRAGMA ↗ операторов. Оператор PRAGMA представляет собой расширение SQL для SQLite. Команды PRAGMA можно использовать, чтобы:
- Изменяет поведение отдельных операций SQLite.
- Запрашивайте у библиотеки SQLite внутренние данные о схемах или таблицах (учтите, что операторы PRAGMA не могут запрашивать содержимое таблицы).
- Управление переменные окружения.
В примерах оператора PRAGMA на этой странице используется следующий SQL.
PRAGMA foreign_keys=off;
DROP TABLE IF EXISTS "Employee";
DROP TABLE IF EXISTS "Category";
DROP TABLE IF EXISTS "Customer";
DROP TABLE IF EXISTS "Shipper";
DROP TABLE IF EXISTS "Supplier";
DROP TABLE IF EXISTS "Order";
DROP TABLE IF EXISTS "Product";
DROP TABLE IF EXISTS "OrderDetail";
DROP TABLE IF EXISTS "CustomerCustomerDemo";
DROP TABLE IF EXISTS "CustomerDemographic";
DROP TABLE IF EXISTS "Region";
DROP TABLE IF EXISTS "Territory";
DROP TABLE IF EXISTS "EmployeeTerritory";
DROP VIEW IF EXISTS [ProductDetails_V];
CREATE TABLE IF NOT EXISTS "Employee" ( "Id" INTEGER PRIMARY KEY, "LastName" VARCHAR(8000) NULL, "FirstName" VARCHAR(8000) NULL, "Title" VARCHAR(8000) NULL, "TitleOfCourtesy" VARCHAR(8000) NULL, "BirthDate" VARCHAR(8000) NULL, "HireDate" VARCHAR(8000) NULL, "Address" VARCHAR(8000) NULL, "City" VARCHAR(8000) NULL, "Region" VARCHAR(8000) NULL, "PostalCode" VARCHAR(8000) NULL, "Country" VARCHAR(8000) NULL, "HomePhone" VARCHAR(8000) NULL, "Extension" VARCHAR(8000) NULL, "Photo" BLOB NULL, "Notes" VARCHAR(8000) NULL, "ReportsTo" INTEGER NULL, "PhotoPath" VARCHAR(8000) NULL);
CREATE TABLE IF NOT EXISTS "Category" ( "Id" INTEGER PRIMARY KEY, "CategoryName" VARCHAR(8000) NULL, "Description" VARCHAR(8000) NULL);
CREATE TABLE IF NOT EXISTS "Customer" ( "Id" VARCHAR(8000) PRIMARY KEY, "CompanyName" VARCHAR(8000) NULL, "ContactName" VARCHAR(8000) NULL, "ContactTitle" VARCHAR(8000) NULL, "Address" VARCHAR(8000) NULL, "City" VARCHAR(8000) NULL, "Region" VARCHAR(8000) NULL, "PostalCode" VARCHAR(8000) NULL, "Country" VARCHAR(8000) NULL, "Phone" VARCHAR(8000) NULL, "Fax" VARCHAR(8000) NULL);
CREATE TABLE IF NOT EXISTS "Shipper" ( "Id" INTEGER PRIMARY KEY, "CompanyName" VARCHAR(8000) NULL, "Phone" VARCHAR(8000) NULL);
CREATE TABLE IF NOT EXISTS "Supplier" ( "Id" INTEGER PRIMARY KEY, "CompanyName" VARCHAR(8000) NULL, "ContactName" VARCHAR(8000) NULL, "ContactTitle" VARCHAR(8000) NULL, "Address" VARCHAR(8000) NULL, "City" VARCHAR(8000) NULL, "Region" VARCHAR(8000) NULL, "PostalCode" VARCHAR(8000) NULL, "Country" VARCHAR(8000) NULL, "Phone" VARCHAR(8000) NULL, "Fax" VARCHAR(8000) NULL, "HomePage" VARCHAR(8000) NULL);
CREATE TABLE IF NOT EXISTS "Order" ( "Id" INTEGER PRIMARY KEY, "CustomerId" VARCHAR(8000) NULL, "EmployeeId" INTEGER NOT NULL, "OrderDate" VARCHAR(8000) NULL, "RequiredDate" VARCHAR(8000) NULL, "ShippedDate" VARCHAR(8000) NULL, "ShipVia" INTEGER NULL, "Freight" DECIMAL NOT NULL, "ShipName" VARCHAR(8000) NULL, "ShipAddress" VARCHAR(8000) NULL, "ShipCity" VARCHAR(8000) NULL, "ShipRegion" VARCHAR(8000) NULL, "ShipPostalCode" VARCHAR(8000) NULL, "ShipCountry" VARCHAR(8000) NULL);
CREATE TABLE IF NOT EXISTS "Product" ( "Id" INTEGER PRIMARY KEY, "ProductName" VARCHAR(8000) NULL, "SupplierId" INTEGER NOT NULL, "CategoryId" INTEGER NOT NULL, "QuantityPerUnit" VARCHAR(8000) NULL, "UnitPrice" DECIMAL NOT NULL, "UnitsInStock" INTEGER NOT NULL, "UnitsOnOrder" INTEGER NOT NULL, "ReorderLevel" INTEGER NOT NULL, "Discontinued" INTEGER NOT NULL);
CREATE TABLE IF NOT EXISTS "OrderDetail" ( "Id" VARCHAR(8000) PRIMARY KEY, "OrderId" INTEGER NOT NULL, "ProductId" INTEGER NOT NULL, "UnitPrice" DECIMAL NOT NULL, "Quantity" INTEGER NOT NULL, "Discount" DOUBLE NOT NULL);
CREATE TABLE IF NOT EXISTS "CustomerCustomerDemo" ( "Id" VARCHAR(8000) PRIMARY KEY, "CustomerTypeId" VARCHAR(8000) NULL);
CREATE TABLE IF NOT EXISTS "CustomerDemographic" ( "Id" VARCHAR(8000) PRIMARY KEY, "CustomerDesc" VARCHAR(8000) NULL);
CREATE TABLE IF NOT EXISTS "Region" ( "Id" INTEGER PRIMARY KEY, "RegionDescription" VARCHAR(8000) NULL);
CREATE TABLE IF NOT EXISTS "Territory" ( "Id" VARCHAR(8000) PRIMARY KEY, "TerritoryDescription" VARCHAR(8000) NULL, "RegionId" INTEGER NOT NULL);
CREATE TABLE IF NOT EXISTS "EmployeeTerritory" ( "Id" VARCHAR(8000) PRIMARY KEY, "EmployeeId" INTEGER NOT NULL, "TerritoryId" VARCHAR(8000) NULL);
CREATE VIEW [ProductDetails_V] as select p.*, c.CategoryName, c.Description as [CategoryDescription], s.CompanyName as [SupplierName], s.Region as [SupplierRegion] from [Product] p join [Category] c on p.CategoryId = c.id join [Supplier] s on s.id = p.SupplierId;PRAGMA table_list
Выводит список таблиц и представлений базы данных, включая системные таблицы, которые поддерживает D1.
Возвращаемые значения
По одной строке на каждую таблицу. Каждая строка содержит:
Schema: схема, в которой находится таблица (например,mainилиtemp)name: имя таблицыtype: тип объекта (один изtable,view,shadow,virtual)ncol: количество столбцов в таблице, включая генерируемые или скрытые столбцыwr:1если таблица является WITHOUT ROWID таблицей,0иначеstrict:1если таблица является STRICT таблицей,0иначе
Пример PRAGMA table_list
PRAGMA table_listnpx wrangler d1 execute [DATABASE_NAME] --command='PRAGMA table_list'🌀 Executing on remote database [DATABASE_NAME] (DATABASE_ID):
🌀 To execute on your local development database, remove the --remote flag from your wrangler command.
🚣 Executed 1 commands in 0.5874ms
┌────────┬──────────────────────┬───────┬──────┬────┬────────┐
│ schema │ name │ type │ ncol │ wr │ strict │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ Territory │ table │ 3 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ CustomerDemographic │ table │ 2 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ OrderDetail │ table │ 6 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ sqlite_schema │ table │ 5 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ Region │ table │ 2 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ _cf_KV │ table │ 2 │ 1 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ ProductDetails_V │ view │ 14 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ EmployeeTerritory │ table │ 3 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ Employee │ table │ 18 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ Category │ table │ 3 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ Customer │ table │ 11 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ Shipper │ table │ 3 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ Supplier │ table │ 12 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ Order │ table │ 14 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ CustomerCustomerDemo │ table │ 2 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ main │ Product │ table │ 10 │ 0 │ 0 │
├────────┼──────────────────────┼───────┼──────┼────┼────────┤
│ temp │ sqlite_temp_schema │ table │ 5 │ 0 │ 0 │
└────────┴──────────────────────┴───────┴──────┴────┴────────┘PRAGMA table_info("TABLE_NAME")
Показывает схему (столбцы, типы, null, значения по умолчанию) для указанной TABLE_NAME.
Возвращаемые значения
По одной строке для каждого столбца указанной таблицы. Каждая строка содержит:
cid: идентификатор строкиname: имя столбцаtype: тип данных (если указан),''иначеnotnull:1если столбец может быть NULL,0иначеdflt_value: значение столбца по умолчаниюpk:1если столбец является первичным ключом,0иначе
Пример PRAGMA table_info
PRAGMA table_infonpx wrangler d1 execute [DATABASE_NAME] --command='PRAGMA table_info("Order")'🌀 Executing on remote database [DATABASE_NAME] (DATABASE_ID):
🌀 To execute on your local development database, remove the --remote flag from your wrangler command.
🚣 Executed 1 commands in 0.8502ms
┌─────┬────────────────┬───────────────┬─────────┬────────────┬────┐
│ cid │ name │ type │ notnull │ dflt_value │ pk │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 0 │ Id │ INTEGER │ 0 │ │ 1 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 1 │ CustomerId │ VARCHAR(8000) │ 0 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 2 │ EmployeeId │ INTEGER │ 1 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 3 │ OrderDate │ VARCHAR(8000) │ 0 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 4 │ RequiredDate │ VARCHAR(8000) │ 0 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 5 │ ShippedDate │ VARCHAR(8000) │ 0 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 6 │ ShipVia │ INTEGER │ 0 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 7 │ Freight │ DECIMAL │ 1 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 8 │ ShipName │ VARCHAR(8000) │ 0 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 9 │ ShipAddress │ VARCHAR(8000) │ 0 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 10 │ ShipCity │ VARCHAR(8000) │ 0 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 11 │ ShipRegion │ VARCHAR(8000) │ 0 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 12 │ ShipPostalCode │ VARCHAR(8000) │ 0 │ │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┤
│ 13 │ ShipCountry │ VARCHAR(8000) │ 0 │ │ 0 │
└─────┴────────────────┴───────────────┴─────────┴────────────┴────┘PRAGMA table_xinfo("TABLE_NAME")
Аналогично PRAGMA table_info(TABLE_NAME) но также включает генерируемые столбцы.
Пример PRAGMA table_xinfo
PRAGMA table_xinfonpx wrangler d1 execute [DATABASE_NAME] --command='PRAGMA table_xinfo("Order")'🌀 Executing on remote database [DATABASE_NAME] (DATABASE_ID):
🌀 To execute on your local development database, remove the --remote flag from your wrangler command.
🚣 Executed 1 commands in 0.3854ms
┌─────┬────────────────┬───────────────┬─────────┬────────────┬────┬────────┐
│ cid │ name │ type │ notnull │ dflt_value │ pk │ hidden │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 0 │ Id │ INTEGER │ 0 │ │ 1 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 1 │ CustomerId │ VARCHAR(8000) │ 0 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 2 │ EmployeeId │ INTEGER │ 1 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 3 │ OrderDate │ VARCHAR(8000) │ 0 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 4 │ RequiredDate │ VARCHAR(8000) │ 0 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 5 │ ShippedDate │ VARCHAR(8000) │ 0 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 6 │ ShipVia │ INTEGER │ 0 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 7 │ Freight │ DECIMAL │ 1 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 8 │ ShipName │ VARCHAR(8000) │ 0 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 9 │ ShipAddress │ VARCHAR(8000) │ 0 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 10 │ ShipCity │ VARCHAR(8000) │ 0 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 11 │ ShipRegion │ VARCHAR(8000) │ 0 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 12 │ ShipPostalCode │ VARCHAR(8000) │ 0 │ │ 0 │ 0 │
├─────┼────────────────┼───────────────┼─────────┼────────────┼────┼────────┤
│ 13 │ ShipCountry │ VARCHAR(8000) │ 0 │ │ 0 │ 0 │
└─────┴────────────────┴───────────────┴─────────┴────────────┴────┴────────┘PRAGMA index_list("TABLE_NAME")
Показывает индексы для указанной TABLE_NAME.
Возвращаемые значения
По одной строке для каждого индекса, связанного с указанной таблицей. Каждая строка содержит:
seq: порядковый номер для внутреннего учётаname: имя индексаunique:1если индекс является UNIQUE,0иначеorigin: происхождение индекса (cесли созданCREATE INDEXоператор,uесли создан ограничением UNIQUE,pkесли создан ограничением PRIMARY KEY)partial:1если индекс является частичным индексом,0иначе
Пример PRAGMA index_list
PRAGMA index_listnpx wrangler d1 execute [DATABASE_NAME] --command='PRAGMA index_list("Territory")'🌀 Executing on remote database d1-pragma-db (DATABASE_ID):
🌀 To execute on your local development database, remove the --remote flag from your wrangler command.
🚣 Executed 1 commands in 0.2177ms
┌─────┬──────────────────────────────┬────────┬────────┬─────────┐
│ seq │ name │ unique │ origin │ partial │
├─────┼──────────────────────────────┼────────┼────────┼─────────┤
│ 0 │ sqlite_autoindex_Territory_1 │ 1 │ pk │ 0 │
└─────┴──────────────────────────────┴────────┴────────┴─────────┘PRAGMA index_info(INDEX_NAME)
Показывает индексированный столбец (столбцы) для указанной INDEX_NAME.
Возвращаемые значения
По одной строке для каждого ключевого столбца указанного индекса. Каждая строка содержит:
seqno: позиция столбца в индексеcid: позиция столбца в индексируемой таблицеname: имя индексируемого столбца
Пример PRAGMA index_info
PRAGMA index_infonpx wrangler d1 execute [DATABASE_NAME] --command='PRAGMA index_info("sqlite_autoindex_Territory_1")'🌀 Executing on remote database d1-pragma-db (DATABASE_ID):
🌀 To execute on your local development database, remove the --remote flag from your wrangler command.
🚣 Executed 1 commands in 0.2523ms
┌───────┬─────┬──────┐
│ seqno │ cid │ name │
├───────┼─────┼──────┤
│ 0 │ 0 │ Id │
└───────┴─────┴──────┘PRAGMA index_xinfo("INDEX_NAME")
Аналогично PRAGMA index_info("TABLE_NAME") но также включает скрытые столбцы.
Пример PRAGMA index_xinfo
PRAGMA index_xinfonpx wrangler d1 execute [DATABASE_NAME] --command='PRAGMA index_xinfo("sqlite_autoindex_Territory_1")'🌀 Executing on remote database d1-pragma-db (DATABASE_ID):
🌀 To execute on your local development database, remove the --remote flag from your wrangler command.
🚣 Executed 1 commands in 0.6034ms
┌───────┬─────┬──────┬──────┬────────┬─────┐
│ seqno │ cid │ name │ desc │ coll │ key │
├───────┼─────┼──────┼──────┼────────┼─────┤
│ 0 │ 0 │ Id │ 0 │ BINARY │ 1 │
├───────┼─────┼──────┼──────┼────────┼─────┤
│ 1 │ -1 │ │ 0 │ BINARY │ 0 │
└───────┴─────┴──────┴──────┴────────┴─────┘PRAGMA quick_check
Проверяет форматирование и согласованность таблицы, в том числе:
- Записи с некорректным форматированием
- Отсутствующие страницы
- Разделы базы данных, которые используются многократно или не используются вовсе.
Возвращаемые значения
- Если ошибок нет: одну строку со значением
OK - Если возникли ошибки: строку с описанием проблем, выявленных проверкой
Пример PRAGMA quick_check
PRAGMA quick_checknpx wrangler d1 execute [DATABASE_NAME] --command='PRAGMA quick_check'🌀 Executing on remote database [DATABASE_NAME] (DATABASE_ID):
🌀 To execute on your local development database, remove the --remote flag from your wrangler command.
🚣 Executed 1 commands in 1.4073ms
┌─────────────┐
│ quick_check │
├─────────────┤
│ ok │
└─────────────┘PRAGMA foreign_key_check
Проверяет наличие недопустимых ссылок на внешние ключи в выбранной таблице.
PRAGMA foreign_key_list("TABLE_NAME")
Выводит список ограничений внешнего ключа выбранной таблицы.
PRAGMA case_sensitive_like = (on|off)
Переключает чувствительность к регистру для операторов LIKE. Если PRAGMA case_sensitive_like принимает значение:
ON: 'a' LIKE 'A' ложноOFF: 'a' LIKE 'A' истинно (таково поведение оператора LIKE по умолчанию)
PRAGMA ignore_check_constraints = (on|off)
Переключает применение ограничений CHECK. Если PRAGMA ignore_check_constraints принимает значение:
ON: CHECK-ограничения игнорируютсяOFF: CHECK-ограничения применяются (это поведение по умолчанию)
PRAGMA legacy_alter_table = (on|off)
Переключает поведение команды ALTER TABLE RENAME до и после устаревшей версии SQLite (3.24.0). Если PRAGMA legacy_alter_table принимает значение:
ON: ALTER TABLE RENAME переписывает только первое упоминание имени таблицы в её инструкции CREATE TABLE и в связанных с ней инструкциях CREATE INDEX и CREATE TRIGGER. Все остальные упоминания остаются без изменений.OFF: ALTER TABLE RENAME переписывает все ссылки на имя таблицы в схеме (это поведение по умолчанию).
PRAGMA recursive_triggers = (on|off)
Переключает поддержку рекурсивных триггеров. Если PRAGMA recursive_triggers принимает значение:
ON: срабатывающие триггеры могут активировать другие триггеры (один триггер может сработать несколько раз для одной и той же строки)OFF: срабатывающие триггеры не могут активировать другие триггеры
PRAGMA reverse_unordered_selects = (on|off)
Переключает порядок результатов оператора SELECT без предложения ORDER BY. Если PRAGMA reverse_unordered_selects принимает значение:
ON: меняет порядок результатов инструкции SELECT на обратныйOFF: возвращает результаты инструкции SELECT в обычном порядке
PRAGMA foreign_keys = (on|off)
Переключает применение ограничений внешнего ключа. Если PRAGMA foreign_keys принимает значение:
ON: останавливает операции, нарушающие ограничения внешнего ключаOFF: разрешает операции, нарушающие ограничения внешнего ключа
PRAGMA defer_foreign_keys = (on|off)
Позволяет отложить применение ограничения внешнего ключа до завершения текущей транзакции. Это может быть полезно во время миграции базы данных, поскольку изменения схемы могут временно нарушать ограничения в зависимости от порядка их применения.
Это не отключает проверку внешних ключей за пределами текущей транзакции. Если к концу транзакции у вас останутся неразрешённые нарушения внешних ключей, она завершится ошибкой FOREIGN KEY constraint failed ошибка.
Обратите внимание, что настройка PRAGMA defer_foreign_keys = ON не препятствует ON DELETE CASCADE выполнение действий. Хотя проверки ограничений внешнего ключа откладываются до конца транзакции, ON DELETE CASCADE операции останутся активными, что соответствует поведению SQLite.
Чтобы отложить проверку внешних ключей, установите PRAGMA defer_foreign_keys = on в начале транзакции или перед изменениями, которые нарушили бы ограничения:
-- Defer foreign key enforcement in this transaction.
PRAGMA defer_foreign_keys = on
-- Run your CREATE TABLE or ALTER TABLE / COLUMN statements
ALTER TABLE users ...
-- This is implicit if not set by the end of the transaction.
PRAGMA defer_foreign_keys = offСм. документация по внешним ключам чтобы узнать больше о работе с внешними ключами.
PRAGMA optimize
Пытается оптимизировать все схемы в базе данных, запуская ANALYZE команду для каждой таблицы, если это необходимо. ANALYZE обновляет внутреннюю таблицу, которая содержит статистику о таблицах и индексах. Эта статистика помогает планировщик запросов чтобы выполнить введённый запрос более эффективно.
Когда PRAGMA optimize выполняет ANALYZE, это задаёт ограничение, чтобы выполнение команды не затягивалось. Либо PRAGMA optimize может счесть ненужным выполнение ANALYZE (например, если схема существенно не изменилась). В этом случае оптимизация не выполняется.
Рекомендуем выполнять эту команду после любых изменений схемы (например, после создание индекса).
См. документация по SQLite PRAGMA optimize ↗ с дополнительной информацией о том, как PRAGMA optimize оптимизирует базу данных.
Запрос sqlite_master
Вы также можете выполнить запрос к sqlite_master таблицу, чтобы показать все таблицы, индексы и исходный SQL, использованный для их создания:
SELECT name, sql FROM sqlite_master {
"name": "users",
"sql": "CREATE TABLE users ( user_id INTEGER PRIMARY KEY, email_address TEXT, created_at INTEGER, deleted INTEGER, settings TEXT)"
},
{
"name": "idx_ordered_users",
"sql": "CREATE INDEX idx_ordered_users ON users(created_at DESC)"
},
{
"name": "Order",
"sql": "CREATE TABLE \"Order\" ( \"Id\" INTEGER PRIMARY KEY, \"CustomerId\" VARCHAR(8000) NULL, \"EmployeeId\" INTEGER NOT NULL, \"OrderDate\" VARCHAR(8000) NULL, \"RequiredDate\" VARCHAR(8000) NULL, \"ShippedDate\" VARCHAR(8000) NULL, \"ShipVia\" INTEGER NULL, \"Freight\" DECIMAL NOT NULL, \"ShipName\" VARCHAR(8000) NULL, \"ShipAddress\" VARCHAR(8000) NULL, \"ShipCity\" VARCHAR(8000) NULL, \"ShipRegion\" VARCHAR(8000) NULL, \"ShipPostalCode\" VARCHAR(8000) NULL, \"ShipCountry\" VARCHAR(8000) NULL)"
},
{
"name": "Product",
"sql": "CREATE TABLE \"Product\" ( \"Id\" INTEGER PRIMARY KEY, \"ProductName\" VARCHAR(8000) NULL, \"SupplierId\" INTEGER NOT NULL, \"CategoryId\" INTEGER NOT NULL, \"QuantityPerUnit\" VARCHAR(8000) NULL, \"UnitPrice\" DECIMAL NOT NULL, \"UnitsInStock\" INTEGER NOT NULL, \"UnitsOnOrder\" INTEGER NOT NULL, \"ReorderLevel\" INTEGER NOT NULL, \"Discontinued\" INTEGER NOT NULL)"
}Поиск с помощью LIKE
Поиск можно выполнить с помощью SQL LIKE оператор:
const { results } = await env.DB.prepare(
"SELECT * FROM Customers WHERE CompanyName LIKE ?",
)
.bind("%eve%")
.run();
console.log("results: ", results);results: [...]Дополнительные материалы
- Узнайте как создавать индексы в D1.
- Используйте Функции JSON чтобы делать запросы к данным JSON.
- Используйте
wrangler devчтобы запустить Worker и D1 локально и устранить проблемы перед развёртыванием.