sql >> Databasteknik >  >> RDS >> SQLite

5 sätt att kontrollera en kolumns datatyp i SQLite

I SQLite finns det en hel del sätt att titta på en tabells struktur. Därför finns det en hel del sätt vi kan kontrollera datatypen för kolumnerna i den tabellen.

Det finns också en funktion som låter oss kontrollera datatypen för en kolumn som returneras i en fråga.

Här är fem sätt att kontrollera datatypen för en kolumn i SQLite.

PRAGMA table_info() Uttalande

PRAGMA table_info() sats returnerar information om en specificerad tabell, inklusive dess kolumner och datatyper.

Här är ett exempel på att returnera information om en tabell som heter 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 det här fallet skapades kolumnerna med deras datatyp uttryckligen definierad.

Här är ett annat exempel:

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 det här fallet har endast den första kolumnen sin datatyp explicit definierad.

SQLite använder en annan metod för datatyper än de andra stora RDBMS:erna. SQLite använder ett dynamiskt skrivsystem, så datatypen för ett värde är associerad med själva värdet, inte med dess behållare.

Som sagt, SQLite tillåter oss att explicit specificera datatypen för kolumner. I exemplen ovan skapades vissa kolumner med deras datatyp uttryckligen definierad, och vi kan se vilka dessa datatyper är genom att köra ovanstående PRAGMA uttalande.

PRAGMA table_xinfo() Uttalande

PRAGMA table_xinfo() satsen är exakt samma som PRAGMA table_info() uttalande, förutom att den också returnerar dolda kolumner på virtuella 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 att det i princip är detsamma som table_info() , förutom med den extra kolumnen.

.schema Kommando

Ett annat sätt att hämta en tabells struktur är att använda .schema kommando. Detta är en av flera metoder du kan använda för att returnera den SQL som användes för att skapa tabellen.

Exempel:

.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]);

Den här metoden tillåter oss att generera den SQL som krävs för att återskapa tabellen – inklusive att specificera eventuella datatyper.

sqlite_schema Tabell

Du kan använda sqlite_schema tabell till samma sak som föregående exempel.

Här är ett exempel med samma tabell.

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 Tabellen kan också nås med sqlite_master .

typeof() Funktion

Du kan använda typeof() funktion för att få datatypen för en kolumn returnerad av en fråga. Mer specifikt returnerar den datatypen för det givna uttrycket.

Exempel:

SELECT typeof(Title) FROM Album
LIMIT 1;

Resultat:

text

Här använde jag LIMIT sats för att begränsa resultatet till bara en rad, annars skulle vi se samma resultat upprepat för varje rad i tabellen.

Tänk på att den här metoden returnerar datatypen för uttrycket som returneras av frågan – inte den faktiska datatypen som tilldelats kolumnen. De möjliga typerna som returneras är:

  • null
  • integer
  • real
  • text
  • blob

Varje kolumn i en SQLite-databas tilldelas en av ovanstående typaffiniteter.

Dessa kallas faktiskt lagringsklasser. En lagringsklass är mer allmän än en datatyp. Alla värden i SQL-satser, oavsett om de är bokstavliga inbäddade i SQL-satstext eller parametrar bundna till förkompilerade SQL-satser, har en implicit lagringsklass. Databasmotorn kan konvertera värden mellan numeriska lagringsklasser (INTEGER och REAL ) och TEXT under körning av en fråga.

Mer information om datatyper i SQLite

Se SQLite-datatyper (SQLite-dokumentation) och The Advantages Of Flexible Typing (SQLite-dokumentation) för mer information om datatyper i SQLite.

Se även STRICT tabeller (SQLite-dokumentation), en funktion som lades till i SQLite version 3.37.0 2021-11-27 som gör att vi kan vägra det flexibla skrivsystemet och istället tillämpa det traditionella system med stela typ som finns i alla andra SQL-databasmotorer och i SQL-standarden.


  1. Kontrollera om tabellen finns och om den inte finns, skapa den i SQL Server 2008

  2. 5 sätt att köra ett SQL-skript från en fil i SQLite

  3. Hur ökar man maxanslutningarna i postgres?

  4. Hur väljer jag alla kolumner från en tabell, plus ytterligare kolumner som ROWNUM?