Primární klíč a cizí klíč SQLite s příklady
SQLite Omezení
Omezení sloupců vynucují omezení a pravidla pro hodnoty vložené do sloupce za účelem ověření vložených dat. Omezení sloupců se definují při vytváření tabulky v definici sloupce.
SQLite Primární klíč
Všechny hodnoty ve sloupci primárního klíče by měly být jedinečné a neměly by mít hodnotu null
Primární klíč lze použít pouze na jeden sloupec nebo na kombinaci sloupců, v druhém případě by kombinace hodnot sloupců měla být jedinečná pro všechny řádky tabulek.
Syntaxe:
Existuje mnoho různých způsobů, jak definovat primární klíč v tabulce, například:
- V samotné definici sloupce:
ColumnName INTEGER NOT NULL PRIMARY KEY;
- Jako samostatná definice:
PRIMARY KEY(ColumnName);
- Chcete-li vytvořit kombinaci sloupců jako primární klíč:
PRIMARY KEY(ColumnName1, ColumnName2);
Není nulové omezení
SQLite Omezení Not null zabraňuje tomu, aby měl sloupec hodnotu null:
ColumnName INTEGER NOT NULL;
VÝCHOZÍ omezení
SQLite Výchozí omezení, pokud do sloupce nevložíte žádnou hodnotu, bude místo toho vložena výchozí hodnota.
Pro příklad:
ColumnName INTEGER DEFAULT 0;
Pokud napíšete příkaz insert a nezadáte pro tento sloupec žádnou hodnotu, bude mít sloupec hodnotu 0.
SQLite UNIKÁTNÍ omezení
SQLite Jedinečné omezení zabrání duplicitním hodnotám mezi všemi hodnotami ve sloupci.
Například:
EmployeeId INTEGER NOT NULL UNIQUE;
Tím se prosadí "EmployeeId" aby byla jedinečná, nebudou povoleny žádné duplicitní hodnoty. Všimněte si, že to platí pro hodnoty sloupce "EmployeeId" pouze.
SQLite CHECK omezení
SQLite check constraint podmínka pro kontrolu vložené hodnoty, pokud hodnota neodpovídá podmínce, nebude vložena.
Quantity INTEGER NOT NULL CHECK(Quantity > 10);
Do pole nemůžete vložit hodnotu menší než 10 "Množství" sloupec.
SQLite Cizí klíč
Jedno SQLite cizí klíč je omezení, které ověřuje existenci hodnoty přítomné v jedné tabulce do jiné tabulky, která má vztah s první tabulkou, kde je cizí klíč definován.
Při práci s více tabulkami, kdy existují dvě tabulky, které spolu souvisí s jedním společným sloupcem. A pokud se chcete ujistit, že hodnota vložená do jednoho z nich musí existovat ve sloupci druhé tabulky, měli byste na společný sloupec použít „Omezení cizího klíče“.
V tomto případě, když se pokusíte vložit hodnotu do tohoto sloupce, pak cizí klíč zajistí, že vložená hodnota ve sloupci tabulky existuje.
Všimněte si, že omezení cizích klíčů nejsou ve výchozím nastavení povolena SQLite, musíte je nejprve povolit spuštěním následujícího příkazu:
PRAGMA foreign_keys = ON;
Omezení cizího klíče byla zavedena v SQLite počínaje verzí 3.6.19.
Příklad SQLite Cizí klíč
Předpokládejme, že máme dvě tabulky; Studenti a katedry.
Tabulka Studenti obsahuje seznam studentů a tabulka oddělení obsahuje seznam oddělení. Každý student patří do oddělení; tj. každý student má sloupec departmentId.
Nyní uvidíme, jak může omezení cizího klíče pomoci zajistit, že hodnota ID oddělení v tabulce studentů musí existovat v tabulce oddělení.
Pokud jsme tedy vytvořili omezení cizího klíče na DepartmentId v tabulce Studenti, každé vložené DepartmentId musí být uvedeno v tabulce 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) );
Chcete-li zkontrolovat, jak mohou omezení cizího klíče zabránit vložení nedefinovaného prvku nebo hodnoty do tabulky, která má vztah k jiné tabulce, podíváme se na následující příklad.
V tomto příkladu má tabulka Oddělení omezení cizího klíče na tabulku Studenti, takže jakákoli hodnota departmentId vložená do tabulky Studenti musí existovat v tabulce oddělení. Pokud se pokusíte vložit hodnotu departmentId, která v tabulce departments neexistuje, omezení cizího klíče by vám to zabránilo.
Vložíme dvě oddělení "TO" si "Umění" do tabulky oddělení takto:
INSERT INTO Departments VALUES(1, 'IT'); INSERT INTO Departments VALUES(2, 'Arts');
Tyto dva příkazy by měly vložit dvě oddělení do tabulky oddělení, můžete se ujistit, že tyto dvě hodnoty byly vloženy spuštěním dotazu “VYBRAT * Z oddělení” potom:
Potom zkuste vložit nového studenta s departmentId, který v tabulce oddělení neexistuje:
INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);
Řádek nebude vložen a zobrazí se chyba, která říká: Omezení FOREIGN KEY selhalo.