In SQLite zijn er nogal wat manieren om naar de structuur van een tabel te kijken. Daarom zijn er nogal wat manieren waarop we het gegevenstype van de kolommen in die tabel kunnen controleren.
Er is ook een functie waarmee we het gegevenstype van een kolom kunnen controleren die in een zoekopdracht wordt geretourneerd.
Hier zijn vijf manieren om het gegevenstype van een kolom in SQLite te controleren.
De PRAGMA table_info()
Verklaring
De PRAGMA table_info()
statement retourneert informatie over een opgegeven tabel, inclusief de kolommen en gegevenstypen.
Hier is een voorbeeld van het retourneren van informatie over een tabel met de naam Album
.
PRAGMA table_info(Album);
Resultaat:
cid name type notnull dflt_value pk --- -------- ------------- ------- ---------- -- 0 AlbumId INTEGER 1 1 1 Title NVARCHAR(160) 1 0 2 ArtistId INTEGER 1 0
In dit geval zijn de kolommen gemaakt met een expliciet gedefinieerd gegevenstype.
Hier is nog een voorbeeld:
PRAGMA table_info(Events);
Resultaat:
cid name type notnull dflt_value pk --- --------- ------- ------- ---------- -- 0 EventId INTEGER 0 1 1 EventName 0 0 2 StartDate 0 0 3 EndDate 0 0
In dit geval is alleen voor de eerste kolom het gegevenstype expliciet gedefinieerd.
SQLite gebruikt een andere benadering van gegevenstypen dan de andere grote RDBMS'en. SQLite gebruikt een dynamisch typesysteem, en dus wordt het datatype van een waarde geassocieerd met de waarde zelf, niet met de container.
Dat gezegd hebbende, staat SQLite ons toe om expliciet het gegevenstype van kolommen te specificeren. In de bovenstaande voorbeelden zijn sommige kolommen gemaakt met hun gegevenstype expliciet gedefinieerd, en we kunnen zien wat die gegevenstypen zijn door het bovenstaande PRAGMA
uit te voeren. verklaring.
De PRAGMA table_xinfo()
Verklaring
De PRAGMA table_xinfo()
statement is precies hetzelfde als de PRAGMA table_info()
statement, behalve dat het ook verborgen kolommen op virtuele tabellen retourneert:
PRAGMA table_xinfo(Album);
Resultaat:
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
We kunnen zien dat het in principe hetzelfde is als table_info()
, behalve met de extra kolom.
Het .schema
Commando
Een andere manier om de structuur van een tabel op te halen is door gebruik te maken van het .schema
opdracht. Dit is een van de verschillende methoden die u kunt gebruiken om de SQL te retourneren die is gebruikt om de tabel te maken.
Voorbeeld:
.schema Album
Resultaat:
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]);
Met deze methode kunnen we de SQL genereren die nodig is om de tabel opnieuw te maken, inclusief het specificeren van eventuele gegevenstypen.
Het sqlite_schema
Tabel
U kunt het sqlite_schema
. gebruiken tabel naar hetzelfde als het vorige voorbeeld.
Hier is een voorbeeld waarin dezelfde tabel wordt gebruikt.
SELECT sql
FROM Chinook.sqlite_schema
WHERE tbl_name = 'Album';
Resultaat:
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])
Het sqlite_schema
tabel is ook toegankelijk met sqlite_master
.
Het typeof()
Functie
U kunt de typeof()
. gebruiken functie om het gegevenstype van een kolom te krijgen die door een query wordt geretourneerd. Meer specifiek, het geeft het datatype van de gegeven uitdrukking terug.
Voorbeeld:
SELECT typeof(Title) FROM Album
LIMIT 1;
Resultaat:
text
Hier gebruikte ik de LIMIT
om het resultaat tot slechts één rij te beperken, anders zouden we hetzelfde resultaat voor elke rij in de tabel herhaald zien.
Houd er rekening mee dat deze methode het gegevenstype retourneert van de expressie die door de query wordt geretourneerd, niet het daadwerkelijke gegevenstype dat aan de kolom is toegewezen. De mogelijke typen geretourneerd zijn:
null
integer
real
text
blob
Aan elke kolom in een SQLite-database wordt een van de bovenstaande typeaffiniteiten toegewezen.
Deze worden eigenlijk opslagklassen genoemd. Een opslagklasse is algemener dan een datatype. Alle waarden in SQL-instructies, of het nu gaat om letterlijke waarden die zijn ingesloten in SQL-instructietekst of parameters die zijn gebonden aan vooraf gecompileerde SQL-instructies, hebben een impliciete opslagklasse. De database-engine kan waarden converteren tussen numerieke opslagklassen (INTEGER
en REAL
) en TEXT
tijdens het uitvoeren van de query.
Meer informatie over gegevenstypen in SQLite
Zie SQLite-gegevenstypen (SQLite-documentatie) en De voordelen van flexibel typen (SQLite-documentatie) voor meer informatie over gegevenstypen in SQLite.
Zie ook STRICT
tabellen (SQLite-documentatie), een functie die is toegevoegd in SQLite versie 3.37.0 op 2021-11-27 en waarmee we het flexibele typesysteem kunnen weigeren en in plaats daarvan het traditionele rigide typesysteem dat in alle andere SQL-database-engines en in de SQL-standaard.