← Cloudflare D1 / d1 / sql-api
Příkazy SQL
D1 je kompatibilní s většinou konvencí SQL v SQLite, protože využívá jeho dotazovací engine. D1 podporuje řadu příkazů na úrovni databáze, pomocí kterých můžete vypsat tabulky a indexy a zjistit schéma dané tabulky nebo indexu.
Kterýkoli z těchto příkazů můžete spustit přes konzoli D1 na Cloudflare dashboardu, wrangler d1 execute, nebo pomocí D1 Worker Bindings API.
Podporovaná rozšíření SQLite
D1 podporuje podmnožinu rozšíření SQLite pro doplňkovou funkčnost, včetně:
- modul FTS5 ↗ pro fulltextové vyhledávání (včetně
fts5vocab). - Rozšíření JSON ↗ funkce a operátory JSON.
- Matematické funkce ↗.
Viz zdrojový kód ↗ pro úplný seznam podporovaných funkcí.
Kompatibilní příkazy PRAGMA
D1 podporuje některé SQLite PRAGMA ↗ příkazy. Příkaz PRAGMA je rozšíření SQL pro SQLite. Příkazy PRAGMA lze použít k:
- Upravuje chování některých operací SQLite.
- Dotazujte knihovnu SQLite na interní data o schématech nebo tabulkách (mějte na paměti, že příkazy PRAGMA nemohou dotazovat obsah tabulky).
- Řiďte proměnné prostředí.
Příklady příkazů PRAGMA na této stránce používají následující 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
Zobrazí tabulky a pohledy v databázi. Patří sem i systémové tabulky spravované D1.
Návratové hodnoty
Jeden řádek pro každou tabulku. Každý řádek obsahuje:
Schema: schéma, ve kterém se tabulka nachází (napříkladmainnebotemp)name: název tabulkytype: typ objektu (jeden ztable,view,shadow,virtual)ncol: počet sloupců v tabulce, včetně generovaných nebo skrytých sloupcůwr:1pokud je tabulka typu WITHOUT ROWID,0jinakstrict:1pokud je tabulka typu STRICT,0jinak
Příklad 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")
Zobrazí schéma (sloupce, typy, hodnotu null, výchozí hodnoty) pro danou TABLE_NAME.
Návratové hodnoty
Jeden řádek pro každý sloupec zadané tabulky. Každý řádek obsahuje:
cid: identifikátor řádkuname: název sloupcetype: datový typ (pokud je uveden),''jinaknotnull:1pokud sloupec může být NULL,0jinakdflt_value: výchozí hodnota sloupcepk:1pokud je sloupec primárním klíčem,0jinak
Příklad 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")
Podobně jako PRAGMA table_info(TABLE_NAME) ale zahrnuje také generované sloupce.
Příklad 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")
Zobrazí indexy pro danou TABLE_NAME.
Návratové hodnoty
Jeden řádek pro každý index přidružený k zadané tabulce. Každý řádek obsahuje:
seq: pořadové číslo pro interní sledováníname: název indexuunique:1pokud je index typu UNIQUE,0jinakorigin: původ indexu (cpokud byl vytvořenCREATE INDEXpříkaz,upokud byl vytvořen omezením UNIQUE,pkpokud byl vytvořen omezením PRIMARY KEY)partial:1pokud je index částečným indexem,0jinak
Příklad 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)
Zobrazí indexované sloupce pro danou INDEX_NAME.
Návratové hodnoty
Jeden řádek pro každý klíčový sloupec zadaného indexu. Každý řádek obsahuje:
seqno: pořadí sloupce v rámci indexucid: pořadí sloupce v rámci indexované tabulkyname: název indexovaného sloupce
Příklad 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")
Podobně jako PRAGMA index_info("TABLE_NAME") ale zahrnuje také skryté sloupce.
Příklad 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
Kontroluje formátování a konzistenci tabulky, včetně:
- Nesprávně formátované záznamy
- Chybějící stránky
- Části databáze, které se používají vícekrát nebo se nepoužívají vůbec.
Návratové hodnoty
- Pokud nedojde k žádným chybám: jeden řádek s hodnotou
OK - Pokud dojde k chybám: řetězec, který popisuje problémy označené kontrolou
Příklad 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
Kontroluje neplatné odkazy na cizí klíče ve vybrané tabulce.
PRAGMA foreign_key_list("TABLE_NAME")
Zobrazí omezení cizích klíčů ve vybrané tabulce.
PRAGMA case_sensitive_like = (on|off)
Přepíná rozlišování velkých a malých písmen pro operátory LIKE. Když PRAGMA case_sensitive_like je nastaven na:
ON: 'a' LIKE 'A' je nepravdivéOFF: 'a' LIKE 'A' je pravdivé (toto je výchozí chování operátoru LIKE)
PRAGMA ignore_check_constraints = (on|off)
Přepíná vynucování omezení CHECK. Když PRAGMA ignore_check_constraints je nastaven na:
ON: kontrolní omezení jsou ignorovánaOFF: kontrolní omezení jsou vynucována (toto je výchozí chování)
PRAGMA legacy_alter_table = (on|off)
Přepíná chování příkazu ALTER TABLE RENAME před a po starší verzi SQLite (3.24.0). Když PRAGMA legacy_alter_table je nastaven na:
ON: ALTER TABLE RENAME přepíše pouze první výskyt názvu tabulky v příkazu CREATE TABLE a v souvisejících příkazech CREATE INDEX a CREATE TRIGGER. Všechny ostatní výskyty zůstanou beze změny.OFF: ALTER TABLE RENAME přepíše všechny odkazy na název tabulky ve schématu (toto je výchozí chování).
PRAGMA recursive_triggers = (on|off)
Přepíná možnost rekurzivních triggerů. Když PRAGMA recursive_triggers je nastaven na:
ON: spouštěče, které se aktivují, mohou aktivovat další spouštěče (jeden spouštěč se může nad stejným řádkem spustit vícekrát)OFF: spouštěče, které se aktivují, nemohou aktivovat další spouštěče
PRAGMA reverse_unordered_selects = (on|off)
Přepíná pořadí výsledků příkazu SELECT bez klauzule ORDER BY. Když PRAGMA reverse_unordered_selects je nastaven na:
ON: obrátí pořadí výsledků příkazu SELECTOFF: vrátí výsledky příkazu SELECT v obvyklém pořadí
PRAGMA foreign_keys = (on|off)
Přepíná vynucování omezení cizího klíče. Když PRAGMA foreign_keys je nastaven na:
ON: zastaví operace, které porušují omezení cizích klíčůOFF: povolí operace, které porušují omezení cizích klíčů
PRAGMA defer_foreign_keys = (on|off)
Umožňuje odložit vynucování omezení cizích klíčů až do konce aktuální transakce. To může být užitečné během migrace databáze, protože změny schématu mohou dočasně porušit omezení v závislosti na pořadí, ve kterém se použijí.
Tím se nevypíná vynucování cizích klíčů mimo aktuální transakci. Pokud na konci transakce nemáte vyřešena nedokončená porušení cizích klíčů, transakce selže s FOREIGN KEY constraint failed chyba.
Mějte na paměti, že nastavení PRAGMA defer_foreign_keys = ON nezabraňuje ON DELETE CASCADE akcí. Přestože se kontroly omezení cizího klíče odkládají až do konce transakce, ON DELETE CASCADE operace zůstanou aktivní, v souladu s chováním SQLite.
Chcete-li odložit vynucování cizích klíčů, nastavte PRAGMA defer_foreign_keys = on na začátku transakce nebo před změnami, které by porušily omezení:
-- 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 = offViz dokumentace k cizím klíčům a dozvíte se více o práci s cizími klíči.
PRAGMA optimize
Pokusí se optimalizovat všechna schémata v databázi spuštěním ANALYZE příkaz pro každou tabulku, pokud je to nutné. ANALYZE aktualizuje interní tabulku, která obsahuje statistiky o tabulkách a indexech. Tyto statistiky pomáhají query planner k efektivnějšímu provedení vstupního dotazu.
Když PRAGMA optimize spouští ANALYZE, nastavuje limit, který zajistí, že provedení příkazu nebude trvat příliš dlouho. Případně PRAGMA optimize nemusí považovat za nutné spustit ANALYZE (například pokud se schéma výrazně nezměnilo). V takovém případě se neprovádí žádné optimalizace.
Doporučujeme spustit tento příkaz po každé změně schématu (například po vytvoření indexu).
Viz Dokumentace k SQLite PRAGMA optimize ↗ pro další informace o tom, jak PRAGMA optimize optimalizuje databázi.
Dotaz sqlite_master
Můžete se také dotazovat na sqlite_master tabulku pro zobrazení všech tabulek, indexů a původního SQL použitého k jejich vytvoření:
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)"
}Vyhledávání pomocí LIKE
Vyhledávání můžete provést pomocí SQL LIKE operátoru:
const { results } = await env.DB.prepare(
"SELECT * FROM Customers WHERE CompanyName LIKE ?",
)
.bind("%eve%")
.run();
console.log("results: ", results);results: [...]Související zdroje
- Přečtěte si jak vytvořit indexy v D1.
- Použijte D1 Funkce JSON k dotazování dat JSON.
- Použijte
wrangler devke spuštění Workeru a D1 lokálně a k ladění problémů před nasazením.