Shrnutí :v tomto tutoriálu se naučíte používat SQLite PRIMARY KEY
omezení definovat primární klíč pro tabulku.
Úvod do primárního klíče SQLite
Primární klíč je sloupec nebo skupina sloupců používaných k identifikaci jedinečnosti řádků v tabulce. Každá tabulka má jeden a pouze jeden primární klíč.
SQLite umožňuje definovat primární klíč dvěma způsoby:
Za prvé, pokud má primární klíč pouze jeden sloupec, použijete PRIMARY KEY
omezení sloupce k definování primárního klíče takto:
CREATE TABLE table_name(
column_1 INTEGER NOT NULL PRIMARY KEY,
...
);
Code language: PHP (php)
Za druhé, v případě, že se primární klíč skládá ze dvou nebo více sloupců, použijete PRIMARY KEY
omezení tabulky k definování primární, jak je znázorněno v následujícím prohlášení.
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)
Ve standardu SQL nesmí sloupec primárního klíče obsahovat NULL
hodnoty. To znamená, že sloupec primárního klíče má implicitní NOT NULL
omezení.
Aby však byla aktuální verze SQLite kompatibilní s předchozí verzí, SQLite umožňuje, aby sloupec primárního klíče obsahoval NULL
hodnoty.
Primární klíč SQLite a tabulka rowid
Když vytvoříte tabulku bez určení WITHOUT ROWID
SQLite přidá implicitní sloupec nazvaný rowid
který ukládá 64bitové celé číslo se znaménkem. rowid
sloupec je klíč, který jednoznačně identifikuje řádky v tabulce. Tabulky, které mají rowid
sloupce se nazývají rowid
tabulky.
Pokud má tabulka primární klíč, který se skládá z jednoho sloupce a tento sloupec je definován jako INTEGER
pak se tento sloupec primárního klíče stane aliasem pro rowid
sloupec.
Všimněte si, že pokud přiřadíte jiný typ celého čísla, například BIGINT
a UNSIGNED INT
do sloupce primárního klíče, tento sloupec nebude aliasem pro rowid
sloupec.
Protože rowid
tabulka organizuje svá data jako B-strom, dotazuje se a třídí data rowid
stoly jsou velmi rychlé. Je to rychlejší než použití primárního klíče, který není aliasem rowid
.
Další důležitá poznámka je, že pokud deklarujete sloupec s INTEGER
zadejte a PRIMARY KEY DESC
klauzule, tento sloupec se nestane aliasem pro rowid
sloupec:
CREATE TABLE table(
pk INTEGER PRIMARY KEY DESC,
...
);
Code language: SQL (Structured Query Language) (sql)
Vytvoření příkladů primárního klíče SQLite
Následující příkaz vytvoří tabulku s názvem countries
který má country_id
sloupec jako primární klíč.
CREATE TABLE countries (
country_id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Zkuste to
Protože primární klíč countries
tabulka má pouze jeden sloupec, primární klíč jsme definovali pomocí PRIMARY KEY
omezení sloupců.
Je možné použít PRIMARY KEY
omezení tabulky k definování primárního klíče, který se skládá z jednoho sloupce, jak je znázorněno v následujícím prohlášení:
CREATE TABLE languages (
language_id INTEGER,
name TEXT NOT NULL,
PRIMARY KEY (language_id)
);
Code language: SQL (Structured Query Language) (sql)
Zkuste to
Pro tabulky, jejichž primární klíče se skládají z více než jednoho sloupce, však musíte použít PRIMARY KEY
omezení tabulky pro definování primárních klíčů.
Následující příkaz vytváří country_languages
tabulka, jejíž primární klíč se skládá ze dvou sloupců.
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)
Zkuste to
Přidání příkladu primárního klíče SQLite
Na rozdíl od jiných databázových systémů, např. MySQL a PostgreSQL, nemůžete použít ALTER TABLE
pro přidání primárního klíče do existující tabulky.
Chcete-li obejít omezení, musíte provést následující kroky:
- Nejprve vypněte zaškrtnutí omezení cizího klíče.
- Poté přejmenujte tabulku na jiný název tabulky (old_table)
- Poté vytvořte novou tabulku (tabulku) s přesnou strukturou tabulky, kterou jste přejmenovali.
- Poté zkopírujte data z old_table do tabulky.
- Nakonec zapněte kontrolu omezení cizího klíče
Viz následující prohlášení:
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)
Zkuste to
BEGIN TRANSACTION
zahájí novou transakci. Zajišťuje, že se všechny následující příkazy provedou úspěšně nebo se neprovede vůbec nic.
COMMIT
příkaz potvrdí všechny příkazy.
Vytvořme název tabulky cities
bez primárního klíče.
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)
Zkuste to
Chcete-li přidat primární klíč do cities
tabulky, provedete následující kroky:
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)
Zkuste to
Pokud používáte nástroj GUI SQLite, můžete k zobrazení informací v tabulce použít následující příkaz.
PRAGMA table_info([cities]);
Code language: SQL (Structured Query Language) (sql)
Zkuste to
V tomto tutoriálu jste se naučili používat SQLite PRIMARY KEY
omezení pro definování primárního klíče pro tabulku.