sql >> Database teknologi >  >> RDS >> SQLite

Sådan slippes en fremmednøgle i SQLite

Normalt, hvis du har brug for at slippe en fremmednøgle i SQL, vil du bruge ALTER TABLE udmelding. Men hvis du bruger SQLite, er det ikke en mulighed.

SQLite understøtter en meget begrænset delmængde af ALTER TABLE udmelding. De eneste ting du kan gøre med ALTER TABLE i SQLite omdøbes en tabel, omdøber en kolonne i en tabel eller tilføjer en ny kolonne til en eksisterende tabel.

Du kan med andre ord ikke bruge ALTER TABLE at slippe en fremmednøgle, som du kan i andre RDBMS'er

Den anbefalede måde at "drop" en fremmed nøgle i SQLite er faktisk at overføre dataene til en ny tabel uden en fremmed nøgle (eller med en anden, hvis det er det, du har brug for).

Den anbefalede måde

SQLite-dokumentationen anbefaler en 12-trins proces til at lave skemaændringer i en tabel. Vi bruger den proces til at "slippe" en fremmednøgle i følgende eksempel.

Opret en tabel med en fremmednøgle

Lad os først oprette en tabel med den fremmede nøgle og udfylde den med data.

CREATE TABLE Types( 
    TypeId INTEGER PRIMARY KEY, 
    Type
);

CREATE TABLE Pets( 
    PetId INTEGER PRIMARY KEY, 
    PetName,
    TypeId,
    FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);

INSERT INTO Types VALUES 
    ( NULL, 'Dog' ),
    ( NULL, 'Cat' ),
    ( NULL, 'Parakeet' ),
    ( NULL, 'Hamster' );

INSERT INTO Pets VALUES 
    ( NULL, 'Brush', 3 ),
    ( NULL, 'Tweet', 3 ),
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Woofer', 1 ),
    ( NULL, 'Fluff', 2 );

Faktisk, her oprettede jeg to tabeller og udfyldte dem med data. To tabeller, fordi den første (Typer ) har den primære nøgle og den anden (Kæledyr ) har fremmednøglen. Fremmednøglen blev tilføjet på den sidste linje i den anden tabel.

Vi kan bekræfte, at den fremmede nøgle blev oprettet ved at køre følgende kommando:

PRAGMA foreign_key_list(Pets);

Resultat:

 id  seq  table  from    to      on_update  on_delete  match
 --  ---  -----  ------  ------  ---------  ---------  -----
 0   0    Types  TypeId  TypeId  NO ACTION  NO ACTION  NONE  

Vi kan se detaljerne om den fremmede nøgle-begrænsning.

Lad os nu "slippe" fremmednøglen.

“Slip” fremmednøglen

Følgende kode "dropper" fremmednøglen ved at oprette en ny tabel uden en fremmednøglebegrænsning, overføre dataene til den tabel, slette den oprindelige tabel og derefter omdøbe den nye tabel til navnet på den oprindelige tabel.

PRAGMA foreign_keys = OFF;

BEGIN TRANSACTION;

CREATE TABLE Pets_new( 
    PetId INTEGER PRIMARY KEY, 
    PetName,
    TypeId
);

INSERT INTO Pets_new SELECT * FROM Pets;

DROP TABLE Pets;

ALTER TABLE Pets_new RENAME TO Pets;

COMMIT;

PRAGMA foreign_keys = ON;

Færdig.

Hvis du har brug for at rekonstruere indekser, triggere eller visninger, skal du gøre det efter ALTER TABLE sætning, der omdøber tabellen (lige før COMMIT ).

Lad os nu tjekke tabellen for fremmednøglebegrænsninger igen.

PRAGMA foreign_key_list(Pets);

Resultat:

 

(Det er tomt, fordi der ikke er nogen fremmednøglebegrænsninger på denne tabel.)

Du kan bruge samme metode til at tilføje en fremmednøgle til en eksisterende tabel.

En alternativ metode

Når du ser på det foregående eksempel, tænker du måske, at der er en mere effektiv måde at gøre det på. For eksempel kan du gøre det sådan her:

PRAGMA foreign_keys = OFF;

BEGIN TRANSACTION;

ALTER TABLE Pets RENAME TO Pets_old;

CREATE TABLE Pets( 
    PetId INTEGER PRIMARY KEY, 
    PetName,
    TypeId
);

INSERT INTO Pets SELECT * FROM Pets_old;

DROP TABLE Pets_old;

COMMIT;

PRAGMA foreign_keys = ON;

Og det er sandt. Med mit eksempel fungerer denne metode lige så godt.

Men denne metode har også potentialet til at ødelægge referencer til tabellen i alle eksisterende triggere, visninger og fremmednøglebegrænsninger.

Så hvis din tabel allerede har eksisterende triggere, visninger eller fremmednøglebegrænsninger, er det sandsynligvis mere sikkert at bruge den anbefalede metode.


  1. Kan ikke installere PostgreSQL:Der opstod en fejl under udførelse af Microsoft VC++ runtime installationsprogrammet på Windows XP

  2. Hvordan laver jeg en fuzzy match af firmanavne i MYSQL med PHP til autofuldførelse?

  3. Installation af Oracle Instant Client

  4. PostgreSQL:Advarsel:Konsol kodetabel (437) adskiller sig fra Windows kodetabel (1252)