I SQLite er der en del måder at se på en tabels struktur. Derfor er der en del måder, hvorpå vi kan kontrollere datatypen for kolonnerne i den tabel.
Der er også en funktion, der giver os mulighed for at kontrollere datatypen for en kolonne, der returneres i en forespørgsel.
Her er fem måder at kontrollere datatypen for en kolonne i SQLite.
PRAGMA table_info()
Erklæring
PRAGMA table_info()
sætning returnerer oplysninger om en specificeret tabel, herunder dens kolonner og datatyper.
Her er et eksempel på returnering af oplysninger om en tabel kaldet Album
.
PRAGMA table_info(Album);
Resultat:
cid name type notnull dflt_value pk --- -------- ------------- ------- ---------- -- 0 AlbumId INTEGER 1 1 1 Title NVARCHAR(160) 1 0 2 ArtistId INTEGER 1 0
I dette tilfælde blev kolonnerne oprettet med deres datatype eksplicit defineret.
Her er et andet eksempel:
PRAGMA table_info(Events);
Resultat:
cid name type notnull dflt_value pk --- --------- ------- ------- ---------- -- 0 EventId INTEGER 0 1 1 EventName 0 0 2 StartDate 0 0 3 EndDate 0 0
I dette tilfælde er det kun den første kolonne, der har sin datatype eksplicit defineret.
SQLite bruger en anden tilgang til datatyper end de andre store RDBMS'er. SQLite bruger et dynamisk indtastningssystem, og derfor er datatypen for en værdi forbundet med selve værdien, ikke med dens container.
Når det er sagt, tillader SQLite os eksplicit at angive datatypen for kolonner. I ovenstående eksempler blev nogle kolonner oprettet med deres datatype eksplicit defineret, og vi kan se, hvad disse datatyper er ved at køre ovenstående PRAGMA
erklæring.
PRAGMA table_xinfo()
Erklæring
PRAGMA table_xinfo()
sætningen er nøjagtig den samme som PRAGMA table_info()
sætning, bortset fra at den også returnerer skjulte kolonner på virtuelle tabeller:
PRAGMA table_xinfo(Album);
Resultat:
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
Vi kan se, at det grundlæggende er det samme som table_info()
, undtagen med den ekstra kolonne.
.schema
Kommando
En anden måde at hente en tabels struktur på er ved at bruge .schema
kommando. Dette er en af flere metoder, du kan bruge til at returnere den SQL, der blev brugt til at oprette tabellen.
Eksempel:
.schema Album
Resultat:
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]);
Denne metode giver os mulighed for at generere den SQL, der kræves for at genskabe tabellen – herunder angive eventuelle datatyper.
sqlite_schema
Tabel
Du kan bruge sqlite_schema
tabel til det samme som det foregående eksempel.
Her er et eksempel, der bruger den samme tabel.
SELECT sql
FROM Chinook.sqlite_schema
WHERE tbl_name = 'Album';
Resultat:
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
tabel kan også tilgås ved hjælp af sqlite_master
.
typeof()
Funktion
Du kan bruge typeof()
funktion for at få datatypen for en kolonne returneret af en forespørgsel. Mere specifikt returnerer det datatypen for det givne udtryk.
Eksempel:
SELECT typeof(Title) FROM Album
LIMIT 1;
Resultat:
text
Her brugte jeg LIMIT
klausul for at begrænse resultatet til kun én række, ellers ville vi se det samme resultat gentaget for hver række i tabellen.
Husk, at denne metode returnerer datatypen for det udtryk, der returneres af forespørgslen - ikke den faktiske datatype, der er tildelt kolonnen. De mulige returnerede typer er:
null
integer
real
text
blob
Hver kolonne i en SQLite-database er tildelt en af ovenstående type-tilknytninger.
Disse omtales faktisk som opbevaringsklasser. En lagerklasse er mere generel end en datatype. Alle værdier i SQL-sætninger, uanset om de er bogstaver indlejret i SQL-sætningstekst eller parametre bundet til prækompilerede SQL-sætninger, har en implicit lagerklasse. Databasemotoren kan konvertere værdier mellem numeriske lagerklasser (INTEGER
og REAL
) og TEXT
under udførelse af forespørgsel.
Flere oplysninger om datatyper i SQLite
Se SQLite-datatyper (SQLite-dokumentation) og The Advantages Of Flexible Typing (SQLite-dokumentation) for mere information om datatyper i SQLite.
Se også STRICT
tabeller (SQLite-dokumentation), en funktion, der blev tilføjet i SQLite version 3.37.0 den 2021-11-27, der giver os mulighed for at afvise det fleksible skrivesystem og i stedet håndhæve det traditionelle stive typesystem, der findes i alle andre SQL-databasemotorer og i SQL-standarden.