V SQLite existuje několik způsobů, jak se podívat na strukturu tabulky. Existuje tedy několik způsobů, jak můžeme zkontrolovat datový typ sloupců v této tabulce.
K dispozici je také funkce, která nám umožňuje zkontrolovat datový typ sloupce vráceného v dotazu.
Zde je pět způsobů, jak zkontrolovat datový typ sloupce v SQLite.
PRAGMA table_info()
Prohlášení
PRAGMA table_info()
příkaz vrací informace o zadané tabulce, včetně jejích sloupců a datových typů.
Zde je příklad vrácení informací o tabulce s názvem Album
.
PRAGMA table_info(Album);
Výsledek:
cid name type notnull dflt_value pk --- -------- ------------- ------- ---------- -- 0 AlbumId INTEGER 1 1 1 Title NVARCHAR(160) 1 0 2 ArtistId INTEGER 1 0
V tomto případě byly sloupce vytvořeny s explicitně definovaným typem dat.
Zde je další příklad:
PRAGMA table_info(Events);
Výsledek:
cid name type notnull dflt_value pk --- --------- ------- ------- ---------- -- 0 EventId INTEGER 0 1 1 EventName 0 0 2 StartDate 0 0 3 EndDate 0 0
V tomto případě má svůj datový typ explicitně definován pouze první sloupec.
SQLite používá odlišný přístup k datovým typům než ostatní hlavní RDBMS. SQLite používá systém dynamického typování, takže datový typ hodnoty je spojen s hodnotou samotnou, nikoli s jejím kontejnerem.
To znamená, že SQLite nám umožňuje explicitně specifikovat datový typ sloupců. Ve výše uvedených příkladech byly některé sloupce vytvořeny s explicitně definovaným datovým typem. O jaké datové typy se jedná, můžeme zjistit spuštěním výše uvedeného PRAGMA
prohlášení.
PRAGMA table_xinfo()
Prohlášení
PRAGMA table_xinfo()
příkaz je přesně stejný jako PRAGMA table_info()
kromě toho, že také vrací skryté sloupce ve virtuálních tabulkách:
PRAGMA table_xinfo(Album);
Výsledek:
cid name type notnull dflt_value pk hidden --- -------- ------------- ------- ---------- -- ------ 0 AlbumId INTEGER 1 1 0 1 Title NVARCHAR(160) 1 0 0 2 ArtistId INTEGER 1 0 0
Vidíme, že je to v podstatě stejné jako table_info()
, kromě sloupce navíc.
Schéma .schema
Příkaz
Dalším způsobem, jak získat strukturu tabulky, je použití .schema
příkaz. Toto je jedna z několika metod, které můžete použít k vrácení SQL použitého k vytvoření tabulky.
Příklad:
.schema Album
Výsledek:
CREATE TABLE Chinook.[Album] ( [AlbumId] INTEGER NOT NULL, [Title] NVARCHAR(160) NOT NULL, [ArtistId] INTEGER NOT NULL, CONSTRAINT [PK_Album] PRIMARY KEY ([AlbumId]), FOREIGN KEY ([ArtistId]) REFERENCES [Artist] ([ArtistId]) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE INDEX Chinook.[IFK_AlbumArtistId] ON [Album] ([ArtistId]);
Tato metoda nám umožňuje generovat SQL potřebné k opětovnému vytvoření tabulky – včetně zadání jakýchkoli datových typů.
sqlite_schema
Tabulka
Můžete použít sqlite_schema
tabulky na stejnou věc jako v předchozím příkladu.
Zde je příklad použití stejné tabulky.
SELECT sql
FROM Chinook.sqlite_schema
WHERE tbl_name = 'Album';
Výsledek:
CREATE TABLE [Album] ( [AlbumId] INTEGER NOT NULL, [Title] NVARCHAR(160) NOT NULL, [ArtistId] INTEGER NOT NULL, CONSTRAINT [PK_Album] PRIMARY KEY ([AlbumId]), FOREIGN KEY ([ArtistId]) REFERENCES [Artist] ([ArtistId]) ON DELETE NO ACTION ON UPDATE NO ACTION ) CREATE INDEX [IFK_AlbumArtistId] ON [Album] ([ArtistId])
sqlite_schema
k tabulce lze také přistupovat pomocí sqlite_master
.
typeof()
Funkce
Můžete použít typeof()
funkce k získání datového typu sloupce vráceného dotazem. Přesněji řečeno, vrací datový typ daného výrazu.
Příklad:
SELECT typeof(Title) FROM Album
LIMIT 1;
Výsledek:
text
Zde jsem použil LIMIT
klauzule k omezení výsledku pouze na jeden řádek, jinak bychom viděli stejný výsledek opakující se pro každý řádek v tabulce.
Mějte na paměti, že tato metoda vrací datový typ výrazu vráceného dotazem – nikoli skutečný datový typ přiřazený ke sloupci. Možné vrácené typy jsou:
null
integer
real
text
blob
Každému sloupci v databázi SQLite je přiřazena jedna z výše uvedených typových afinit.
Tyto jsou ve skutečnosti označovány jako třídy úložiště. Třída úložiště je obecnější než datový typ. Všechny hodnoty v příkazech SQL, ať už jde o literály vložené do textu příkazu SQL nebo parametry vázané na předkompilované příkazy SQL, mají implicitní třídu úložiště. Databázový stroj může převádět hodnoty mezi numerickými třídami úložiště (INTEGER
a REAL
) a TEXT
během provádění dotazu.
Další informace o datových typech v SQLite
Další informace o datových typech v SQLite naleznete v tématu Datové typy SQLite (dokumentace SQLite) a Výhody flexibilního psaní (dokumentace SQLite).
Viz také STRICT
tabulky (dokumentace SQLite), funkce, která byla přidána ve verzi SQLite 3.37.0 dne 27. 11. 2021, která nám umožňuje odmítnout systém flexibilního psaní a místo toho vynutit tradiční systém rigidního typu, který se nachází ve všech ostatních databázových strojích SQL a v standard SQL.