Chiave primaria e chiave esterna inserite SQLite con esempi
SQLite vincoli
I vincoli di colonna impongono vincoli e regole ai valori inseriti in una colonna per convalidare i dati inseriti. I vincoli delle colonne vengono definiti durante la creazione di una tabella, nella definizione della colonna.
SQLite Chiave primaria
Tutti i valori su una colonna di chiave primaria devono essere univoci e non nulli
La chiave primaria può essere applicata ad una sola colonna o ad una combinazione di colonne, in quest'ultimo caso la combinazione dei valori delle colonne deve essere univoca per tutte le righe della tabella.
Sintassi:
Esistono molti modi diversi per definire una chiave primaria su una tabella come:
- Nella definizione della colonna stessa:
ColumnName INTEGER NOT NULL PRIMARY KEY;
- Come definizione separata:
PRIMARY KEY(ColumnName);
- Per creare una combinazione di colonne come chiave primaria:
PRIMARY KEY(ColumnName1, ColumnName2);
Vincolo non nullo
SQLite Il vincolo Not null impedisce a una colonna di avere un valore nullo:
ColumnName INTEGER NOT NULL;
Vincolo PREDEFINITO
SQLite Vincolo predefinito se non si inserisce alcun valore in una colonna, verrà invece inserito il valore predefinito.
Per esempio:
ColumnName INTEGER DEFAULT 0;
Se scrivi un'istruzione di inserimento e non hai specificato alcun valore per quella colonna, la colonna avrà il valore 0.
SQLite Vincolo UNICO
SQLite Vincolo univoco impedirà valori duplicati tra tutti i valori della colonna.
Per esempio:
EmployeeId INTEGER NOT NULL UNIQUE;
Ciò applicherà il "ID Dipendente" valore sia univoco, non saranno consentiti valori duplicati. Tieni presente che ciò si applica ai valori della colonna "ID Dipendente" solo.
SQLite Vincolo di VERIFICA
SQLite check vincola una condizione per verificare un valore inserito, se il valore non corrisponde alla condizione, non verrà inserito.
Quantity INTEGER NOT NULL CHECK(Quantity > 10);
Non è possibile inserire un valore inferiore a 10 nel file "Quantità" colonna.
SQLite chiave esterna
Le SQLite la chiave esterna è un vincolo che verifica l'esistenza del valore presente in una tabella su un'altra tabella che ha una relazione con la prima tabella in cui è definita la chiave esterna.
Quando si lavora con più tabelle, quando sono presenti due tabelle correlate tra loro con una colonna in comune. E se vuoi assicurarti che il valore inserito in uno di essi debba esistere nella colonna dell'altra tabella, allora dovresti usare un “Vincolo di chiave esterna” sulla colonna in comune.
In questo caso, quando provi a inserire un valore in quella colonna, la chiave esterna garantirà che il valore inserito esista nella colonna della tabella.
Tieni presente che i vincoli delle chiavi esterne non sono abilitati per impostazione predefinita in SQLite, devi prima abilitarli eseguendo il seguente comando:
PRAGMA foreign_keys = ON;
Sono stati introdotti vincoli di chiave esterna SQLite a partire dalla versione 3.6.19.
Esempio di SQLite chiave esterna
Supponiamo di avere due tabelle; Studenti e Dipartimenti.
La tabella Studenti contiene un elenco di studenti e la tabella Dipartimenti contiene un elenco dei dipartimenti. Ogni studente appartiene ad un dipartimento; cioè, ogni studente ha una colonna DepartmentId.
Ora vedremo come il vincolo di chiave esterna può essere utile per garantire che il valore dell'ID del dipartimento nella tabella degli studenti debba esistere nella tabella dei dipartimenti.
Pertanto, se creiamo un vincolo di chiave esterna sul DepartmentId nella tabella Students, ciascun DepartmentId inserito dovrà essere presente nella tabella Departments.
CREATE TABLE [Departments] ( [DepartmentId] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [DepartmentName] NVARCHAR(50) NULL ); CREATE TABLE [Students] ( [StudentId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, [StudentName] NVARCHAR(50) NULL, [DepartmentId] INTEGER NOT NULL, [DateOfBirth] DATE NULL, FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId) );
Per verificare come i vincoli di chiave esterna possano impedire l'inserimento di elementi o valori indefiniti in una tabella che ha una relazione con un'altra tabella, esamineremo il seguente esempio.
In questo esempio, la tabella Departments ha un vincolo di chiave esterna per la tabella Students, quindi qualsiasi valore DepartmentId inserito nella tabella Students deve esistere nella tabella Departments. Se provi a inserire un valore departmentId che non esiste nella tabella dei dipartimenti, il vincolo di chiave esterna ti impedirebbe di farlo.
Inseriamo due dipartimenti "IT" e a “Arti” nella tabella dei dipartimenti come segue:
INSERT INTO Departments VALUES(1, 'IT'); INSERT INTO Departments VALUES(2, 'Arts');
Le due istruzioni dovrebbero inserire due dipartimenti nella tabella dei dipartimenti, puoi assicurarti che i due valori siano stati inseriti eseguendo la query “SELEZIONA * DA Dipartimenti” dopo di che:
Prova quindi ad inserire un nuovo studente con un departmentId che non esiste nella tabella dei dipartimenti:
INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);
La riga non verrà inserita e riceverai un errore che dice che: Vincolo FOREIGN KEY non riuscito.