D1 supports a number of database-level commands that allow you to list tables, indexes, and inspect the schema for a given table or index.
D1 supports a number of database-level statements that allow you to list tables, indexes, and inspect the schema for a given table or index.
You can execute any of these statements via the D1 console in the Cloudflare dashboard, wrangler d1 execute
, or with the D1 client API .
The PRAGMA statement examples on this page use the following SQL.
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;
Lists the tables and views in the database. This includes the system tables maintained by D1.
Returns:
One row per each table. Each row contains:
Schema
: the schema in which the table appears (for example, main
or temp
)
name
: the name of the table
type
: the type of the object (one of table
, view
, shadow
, virtual
)
ncol
: the number of columns in the table, including generated or hidden columns
wr
: 1
if the table is a WITHOUT ROWID table, 0
otherwise
strict
: 1
if the table is a STRICT table, 0
otherwise
Example of PRAGMA table_list
npx 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")
Shows the schema (columns, types, null, default values) for the given TABLE_NAME
.
Returns:
One row for each column in the specified table. Each row contains:
cid
: a row identifier
name
: the name of the column
type
: the data type (if provided), ''
otherwise
notnull
: 1
if the column can be NULL, 0
otherwise
dflt_value
: the default value of the column
pk
: 1
if the column is a primary key, 0
otherwise
Example of PRAGMA table_info
npx 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")
Similar to PRAGMA table_info(TABLE_NAME)
but also includes generated columns .
Example of PRAGMA table_xinfo
npx 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")
Show the indexes for the given TABLE_NAME
.
Returns:
One row for each index associated with the specified table. Each row contains:
seq
: a sequence number for internal tracking
name
: the name of the index
unique
: 1
if the index is UNIQUE, 0
otherwise
origin
: the origin of the index (c
if created by CREATE INDEX
statement, u
if created by UNIQUE constraint, pk
if created by a PRIMARY KEY constraint)
partial
: 1
if the index is a partial index, 0
otherwise
Example of PRAGMA index_list
npx 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)
Show the indexed column(s) for the given INDEX_NAME
.
Returns:
One row for each key column in the specified index. Each row contains:
seqno
: the rank of the column within the index
cid
: the rank of the column within the table being indexed
name
: the name of the column being indexed
Example of PRAGMA index_info
npx 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 β
βββββββββΌββββββΌβββββββ€
βββββββββ΄ββββββ΄βββββββ
PRAGMA index_xinfo("INDEX_NAME")
Similar to PRAGMA index_info("TABLE_NAME")
but also includes hidden columns.
Example of PRAGMA index_xinfo
npx 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 β
βββββββββ΄ββββββ΄βββββββ΄βββββββ΄βββββββββ΄ββββββ
Checks the formatting and consistency of the table, including:
Incorrectly formatted records
Missing pages
Sections of the database which are used multiple times, or are not used at all.
Returns:
If there are no errors: a single row with the value OK
If there are errors: a string which describes the issues flagged by the check
Example of PRAGMA quick_check
npx 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
βββββββββββββββ
βββββββββββββββ€
βββββββββββββββ
Checks for invalid references of foreign keys in the selected table.
PRAGMA foreign_key_list("TABLE_NAME")
Lists the foreign key constraints in the selected table.
PRAGMA case_sensitive_like = (on|off)
Toggles case sensitivity for LIKE operators. When PRAGMA case_sensitive_like
is set to:
ON
: βaβ LIKE βAβ is false
OFF
: βaβ LIKE βAβ is true (this is the default behavior of the LIKE operator)
PRAGMA ignore_check_constraints = (on|off)
Toggles the enforcement of CHECK constraints. When PRAGMA ignore_check_constraints
is set to:
ON
: check constraints are ignored
OFF
: check constraints are enforced (this is the default behavior)
PRAGMA legacy_alter_table = (on|off)
Toggles the ALTER TABLE RENAME command behavior before/after the legacy version of SQLite (3.24.0). When PRAGMA legacy_alter_table
is set to:
ON
: ALTER TABLE RENAME only rewrites the initial occurrence of the table name in its CREATE TABLE statement and any associated CREATE INDEX and CREATE TRIGGER statements. All other occurrences are unmodified.
OFF
: ALTER TABLE RENAME rewrites all references to the table name in the schema (this is the default behavior).
PRAGMA recursive_triggers = (on|off)
Toggles the recursive trigger capability. When PRAGMA recursive_triggers
is set to:
ON
: triggers which fire can activate other triggers (a single trigger can fire multiple times over the same row)
OFF
: triggers which fire cannot activate other triggers
PRAGMA reverse_unordered_selects = (on|off)
Toggles the order of the results of a SELECT statement without an ORDER BY clause. When PRAGMA reverse_unordered_selects
is set to:
ON
: reverses the order of results of a SELECT statement
OFF
: returns the results of a SELECT statement in the usual order
PRAGMA foreign_keys = (on|off)
Toggles the foreign key constraint enforcement. When PRAGMA foreign_keys
is set to:
ON
: stops operations which violate foreign key constraints
OFF
: allows operations which violate foreign key constraints
PRAGMA defer_foreign_keys = (on|off)
Allows you to defer the enforcement of foreign key constraints until the end of the current transaction. This can be useful during database migrations , as schema changes may temporarily violate constraints depending on the order in which they are applied.
This does not disable foreign key enforcement outside of the current transaction. If you have not resolved outstanding foreign key violations at the end of your transaction, it will fail with a FOREIGN KEY constraint failed
error.
Note that setting PRAGMA defer_foreign_keys = ON
does not prevent ON DELETE CASCADE
actions from being executed. While foreign key constraint checks are deferred until the end of a transaction, ON DELETE CASCADE
operations will remain active, consistent with SQLiteβs behavior.
To defer foreign key enforcement, set PRAGMA defer_foreign_keys = on
at the start of your transaction, or ahead of changes that would violate constraints:
-- Defer foreign key enforcement in this transaction.
PRAGMA defer_foreign_keys = on
-- Run your CREATE TABLE or ALTER TABLE / COLUMN statements
-- This is implicit if not set by the end of the transaction.
PRAGMA defer_foreign_keys = off
Refer to the foreign key documentation to learn more about how to work with foreign keys.
You can also query the sqlite_master
table to show all tables, indexes, and the original SQL used to generate them:
SELECT name , sql FROM sqlite_master
" 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)"
" 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)"
" 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)"
D1 supports a subset of SQLite extensions for added functionality, including: