Samenvatting :in deze tutorial leer je hoe je SQLite PRIMARY KEY
. gebruikt beperking om een primaire sleutel voor een tabel te definiëren.
Inleiding tot de primaire sleutel van SQLite
Een primaire sleutel is een kolom of groep kolommen die wordt gebruikt om de uniciteit van rijen in een tabel te identificeren. Elke tabel heeft één en slechts één primaire sleutel.
Met SQLite kunt u de primaire sleutel op twee manieren definiëren:
Ten eerste, als de primaire sleutel maar één kolom heeft, gebruik je de PRIMARY KEY
kolombeperking om de primaire sleutel als volgt te definiëren:
CREATE TABLE table_name(
column_1 INTEGER NOT NULL PRIMARY KEY,
...
);
Code language: PHP (php)
Ten tweede, als de primaire sleutel uit twee of meer kolommen bestaat, gebruik je de PRIMARY KEY
tabelbeperking om de primaire te definiëren, zoals weergegeven in de volgende instructie.
CREATE TABLE table_name(
column_1 INTEGER NOT NULL,
column_2 INTEGER NOT NULL,
...
PRIMARY KEY(column_1,column_2,...)
);
Code language: SQL (Structured Query Language) (sql)
In de SQL-standaard mag de kolom met de primaire sleutel geen NULL
bevatten waarden. Dit betekent dat de primaire sleutelkolom een impliciete NOT NULL
. heeft beperking.
Om de huidige versie van SQLite echter compatibel te maken met de eerdere versie, staat SQLite toe dat de primaire sleutelkolom NULL
bevat. waarden.
SQLite primaire sleutel en rowid-tabel
Wanneer u een tabel maakt zonder de WITHOUT ROWID
. op te geven optie, voegt SQLite een impliciete kolom toe genaamd rowid
dat 64-bits geheel getal met teken opslaat. De rowid
kolom is een sleutel die de rijen in de tabel op unieke wijze identificeert. Tabellen die rowid
. hebben kolommen heten rowid
tabellen.
Als een tabel de primaire sleutel heeft die uit één kolom bestaat, en die kolom is gedefinieerd als INTEGER
dan wordt deze primaire sleutelkolom een alias voor de rowid
kolom.
Merk op dat als u een ander geheel getaltype toewijst, zoals BIGINT
en UNSIGNED INT
naar de primaire sleutelkolom, zal deze kolom geen alias zijn voor de rowid
kolom.
Omdat de rowid
tabel organiseert zijn gegevens als een B-boom, waarbij de gegevens van een rowid
worden opgevraagd en gesorteerd tafel zijn erg snel. Het is sneller dan het gebruik van een primaire sleutel die geen alias is van de rowid
.
Een andere belangrijke opmerking is dat als u een kolom declareert met de INTEGER
type en PRIMARY KEY DESC
clausule, wordt deze kolom geen alias voor de rowid
kolom:
CREATE TABLE table(
pk INTEGER PRIMARY KEY DESC,
...
);
Code language: SQL (Structured Query Language) (sql)
Voorbeelden van SQLite-primaire sleutels maken
De volgende instructie creëert een tabel met de naam countries
die country_id
. heeft kolom als de primaire sleutel.
CREATE TABLE countries (
country_id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Probeer het
Omdat de primaire sleutel van de countries
tabel heeft slechts één kolom, we hebben de primaire sleutel gedefinieerd met behulp van PRIMARY KEY
kolombeperking.
Het is mogelijk om de PRIMARY KEY
. te gebruiken tabelbeperking om de primaire sleutel te definiëren die uit één kolom bestaat, zoals weergegeven in de volgende instructie:
CREATE TABLE languages (
language_id INTEGER,
name TEXT NOT NULL,
PRIMARY KEY (language_id)
);
Code language: SQL (Structured Query Language) (sql)
Probeer het
Voor tabellen waarvan de primaire sleutels uit meer dan één kolom bestaan, moet u echter PRIMARY KEY
gebruiken tabelbeperking om primaire sleutels te definiëren.
De volgende instructie creëert de country_languages
tabel waarvan de primaire sleutel uit twee kolommen bestaat.
CREATE TABLE country_languages (
country_id INTEGER NOT NULL,
language_id INTEGER NOT NULL,
PRIMARY KEY (country_id, language_id),
FOREIGN KEY (country_id) REFERENCES countries (country_id)
ON DELETE CASCADE ON UPDATE NO ACTION,
FOREIGN KEY (language_id) REFERENCES languages (language_id)
ON DELETE CASCADE ON UPDATE NO ACTION
);
Code language: PHP (php)
Probeer het
Voorbeeld van SQLite-primaire sleutel toevoegen
In tegenstelling tot andere databasesystemen, zoals MySQL en PostgreSQL, kunt u de ALTER TABLE
niet gebruiken statement om een primaire sleutel aan een bestaande tabel toe te voegen.
U moet deze stappen volgen om de beperking te omzeilen:
- Schakel eerst de vinkje voor de externe sleutelconstarint uit.
- Hernoem vervolgens de tabel naar een andere tabelnaam (old_table)
- Maak vervolgens een nieuwe tabel (tabel) met de exacte structuur van de tabel waarvan u de naam hebt gekregen.
- Kopieer daarna de gegevens van de old_table naar de tabel.
- Schakel ten slotte de beperking van de externe sleutel in
Zie de volgende uitspraken:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE table RENAME TO old_table;
-- define the primary key constraint here
CREATE TABLE table ( ... );
INSERT INTO table SELECT * FROM old_table;
COMMIT;
PRAGMA foreign_keys=on;
Code language: SQL (Structured Query Language) (sql)
Probeer het
De BEGIN TRANSACTION
start een nieuwe transactie. Het zorgt ervoor dat alle volgende instructies met succes worden uitgevoerd of dat er helemaal niets wordt uitgevoerd.
De COMMIT
statement begaat alle uitspraken.
Laten we een tabelnaam maken cities
zonder een primaire sleutel.
CREATE TABLE cities (
id INTEGER NOT NULL,
name text NOT NULL
);
INSERT INTO cities (id, name)
VALUES(1, 'San Jose');
Code language: SQL (Structured Query Language) (sql)
Probeer het
Om de primaire sleutel toe te voegen aan de cities
tabel, voert u de volgende stappen uit:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE cities RENAME TO old_cities;
CREATE TABLE cities (
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL
);
INSERT INTO cities
SELECT * FROM old_cities;
DROP TABLE old_cities;
COMMIT;
PRAGMA foreign_keys=on;
Code language: SQL (Structured Query Language) (sql)
Probeer het
Als u de SQLite GUI-tool gebruikt, kunt u de volgende instructie gebruiken om de informatie over de tabel te tonen.
PRAGMA table_info([cities]);
Code language: SQL (Structured Query Language) (sql)
Probeer het
In deze tutorial heb je geleerd om de SQLite PRIMARY KEY
. te gebruiken beperking om de primaire sleutel voor een tabel te definiëren.