sql >> Database >  >> RDS >> SQLite

5 manieren om het gegevenstype van een kolom in SQLite te controleren

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.


  1. Een database opslaan als een sjabloon in Access 2016

  2. Benchmarking van beheerde PostgreSQL-cloudoplossingen:deel twee - Amazon RDS

  3. Fix "FOUT:elke UNION-query moet hetzelfde aantal kolommen hebben" in PostgreSQL

  4. cx orakel ImportError