Résumé :dans ce tutoriel, vous apprendrez à utiliser SQLite PRIMARY KEY
contrainte pour définir une clé primaire pour une table.
Introduction à la clé primaire SQLite
Une clé primaire est une colonne ou un groupe de colonnes utilisé pour identifier l'unicité des lignes d'une table. Chaque table a une et une seule clé primaire.
SQLite vous permet de définir la clé primaire de deux manières :
Tout d'abord, si la clé primaire n'a qu'une seule colonne, vous utilisez la PRIMARY KEY
contrainte de colonne pour définir la clé primaire comme suit :
CREATE TABLE table_name(
column_1 INTEGER NOT NULL PRIMARY KEY,
...
);
Code language: PHP (php)
Deuxièmement, dans le cas où la clé primaire se compose de deux colonnes ou plus, vous utilisez la PRIMARY KEY
contrainte de table pour définir le primaire comme indiqué dans l'instruction suivante.
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)
En standard SQL, la colonne de clé primaire ne doit pas contenir NULL
valeurs. Cela signifie que la colonne de clé primaire a un NOT NULL
implicite contrainte.
Cependant, pour rendre la version actuelle de SQLite compatible avec la version antérieure, SQLite permet à la colonne de clé primaire de contenir NULL
valeurs.
Clé primaire SQLite et table rowid
Lorsque vous créez une table sans spécifier le WITHOUT ROWID
option, SQLite ajoute une colonne implicite appelée rowid
qui stocke un entier signé 64 bits. Le rowid
colonne est une clé qui identifie de manière unique les lignes de la table. Tables qui ont rowid
les colonnes sont appelées rowid
tableaux.
Si une table a la clé primaire qui se compose d'une colonne et que cette colonne est définie comme INTEGER
alors cette colonne de clé primaire devient un alias pour le rowid
colonne.
Notez que si vous affectez un autre type entier tel que BIGINT
et UNSIGNED INT
à la colonne de clé primaire, cette colonne ne sera pas un alias pour le rowid
colonne.
Parce que le rowid
table organise ses données sous la forme d'un arbre B, interrogeant et triant les données d'un rowid
le tableau est très rapide. C'est plus rapide que d'utiliser une clé primaire qui n'est pas un alias du rowid
.
Une autre remarque importante est que si vous déclarez une colonne avec le INTEGER
type et PRIMARY KEY DESC
clause, cette colonne ne deviendra pas un alias pour le rowid
colonne :
CREATE TABLE table(
pk INTEGER PRIMARY KEY DESC,
...
);
Code language: SQL (Structured Query Language) (sql)
Création d'exemples de clé primaire SQLite
L'instruction suivante crée une table nommée countries
qui a country_id
colonne comme clé primaire.
CREATE TABLE countries (
country_id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Essayez-le
Parce que la clé primaire des countries
table a une seule colonne, nous avons défini la clé primaire en utilisant PRIMARY KEY
contrainte de colonne.
Il est possible d'utiliser la PRIMARY KEY
contrainte de table pour définir la clé primaire composée d'une colonne, comme indiqué dans l'instruction suivante :
CREATE TABLE languages (
language_id INTEGER,
name TEXT NOT NULL,
PRIMARY KEY (language_id)
);
Code language: SQL (Structured Query Language) (sql)
Essayez-le
Cependant, pour les tables dont les clés primaires sont constituées de plusieurs colonnes, vous devez utiliser PRIMARY KEY
contrainte de table pour définir les clés primaires.
L'instruction suivante crée le country_languages
table dont la clé primaire est composée de deux colonnes.
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)
Essayez-le
Ajout d'un exemple de clé primaire SQLite
Contrairement à d'autres systèmes de base de données, par exemple MySQL et PostgreSQL, vous ne pouvez pas utiliser ALTER TABLE
pour ajouter une clé primaire à une table existante.
Vous devez suivre ces étapes pour contourner la limitation :
- Tout d'abord, désactivez la vérification de la contrainte de clé étrangère.
- Ensuite, renommez la table avec un autre nom de table (old_table)
- Ensuite, créez une nouvelle table (table) avec la structure exacte de la table que vous avez renommée.
- Après cela, copiez les données de l'ancienne_table vers la table.
- Enfin, activez la vérification des contraintes de clé étrangère
Voir les déclarations suivantes :
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)
Essayez-le
Le BEGIN TRANSACTION
démarre une nouvelle transaction. Il garantit que toutes les instructions suivantes s'exécutent avec succès ou que rien ne s'exécute du tout.
Le COMMIT
instruction valide toutes les instructions.
Créons un nom de table cities
sans clé primaire.
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)
Essayez-le
Afin d'ajouter la clé primaire aux cities
table, vous effectuez les étapes suivantes :
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)
Essayez-le
Si vous utilisez l'outil d'interface graphique SQLite, vous pouvez utiliser l'instruction suivante pour afficher les informations de la table.
PRAGMA table_info([cities]);
Code language: SQL (Structured Query Language) (sql)
Essayez-le
Dans ce tutoriel, vous avez appris à utiliser la SQLite PRIMARY KEY
contrainte pour définir la clé primaire d'une table.