Резюме :в този урок ще научите как да използвате SQLite PRIMARY KEY
ограничение за дефиниране на първичен ключ за таблица.
Въведение в първичния ключ на SQLite
Първичният ключ е колона или група от колони, използвани за идентифициране на уникалността на редовете в таблица. Всяка таблица има един и само един първичен ключ.
SQLite ви позволява да дефинирате първичен ключ по два начина:
Първо, ако първичният ключ има само една колона, използвате PRIMARY KEY
ограничение на колоната, за да дефинирате първичния ключ, както следва:
CREATE TABLE table_name(
column_1 INTEGER NOT NULL PRIMARY KEY,
...
);
Code language: PHP (php)
Второ, в случай, че първичният ключ се състои от две или повече колони, използвате PRIMARY KEY
ограничение на таблицата, за да дефинирате първичния, както е показано в следния израз.
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)
В SQL стандарта колоната с първичен ключ не трябва да съдържа NULL
стойности. Това означава, че колоната с първичен ключ има неявно NOT NULL
ограничение.
Въпреки това, за да направи текущата версия на SQLite съвместима с по-ранната версия, SQLite позволява колоната с първичен ключ да съдържа NULL
стойности.
SQLite първичен ключ и rowid таблица
Когато създавате таблица, без да посочите WITHOUT ROWID
опция, SQLite добавя неявна колона, наречена rowid
който съхранява 64-битово цяло число със знак. rowid
колоната е ключ, който уникално идентифицира редовете в таблицата. Таблици, които имат rowid
колоните се наричат rowid
таблици.
Ако таблица има първичен ключ, който се състои от една колона и тази колона е дефинирана като INTEGER
тогава тази колона с първичен ключ става псевдоним за rowid
колона.
Забележете, че ако присвоите друг целочислен тип, като BIGINT
и UNSIGNED INT
към колоната с първичен ключ, тази колона няма да бъде псевдоним за rowid
колона.
Тъй като rowid
таблицата организира своите данни като B-дърво, като прави заявки и сортира данни от rowid
масата са много бързи. Това е по-бързо от използването на първичен ключ, който не е псевдоним на rowid
.
Друга важна забележка е, че ако декларирате колона с INTEGER
тип и PRIMARY KEY DESC
клауза, тази колона няма да стане псевдоним за rowid
колона:
CREATE TABLE table(
pk INTEGER PRIMARY KEY DESC,
...
);
Code language: SQL (Structured Query Language) (sql)
Създаване на примери за първичен ключ на SQLite
Следното изявление създава таблица с име countries
който има country_id
колона като първичен ключ.
CREATE TABLE countries (
country_id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Тъй като първичният ключ на countries
таблицата има само една колона, дефинирахме първичния ключ с помощта на PRIMARY KEY
ограничение на колоната.
Възможно е да се използва PRIMARY KEY
ограничение на таблицата за дефиниране на първичния ключ, който се състои от една колона, както е показано в следния израз:
CREATE TABLE languages (
language_id INTEGER,
name TEXT NOT NULL,
PRIMARY KEY (language_id)
);
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Въпреки това, за таблици, в които първичните ключове се състоят от повече от една колона, трябва да използвате PRIMARY KEY
ограничение на таблицата за дефиниране на първични ключове.
Следното изявление създава country_languages
таблица, чийто първичен ключ се състои от две колони.
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)
Опитайте го
Пример за добавяне на първичен ключ на SQLite
За разлика от други системи за бази данни, например MySQL и PostgreSQL, не можете да използвате ALTER TABLE
оператор за добавяне на първичен ключ към съществуваща таблица.
Трябва да следвате тези стъпки, за да заобиколите ограничението:
- Първо, изключете отметката на константата на външния ключ.
- След това преименувайте таблицата на друго име на таблица (стара_таблица)
- След това създайте нова таблица (таблица) с точната структура на таблицата, която сте преименували.
- След това копирайте данните от old_table в таблицата.
- Накрая включете проверката на ограничението на външния ключ
Вижте следните твърдения:
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)
Опитайте го
BEGIN TRANSACTION
започва нова транзакция. Той гарантира, че всички следващи оператори се изпълняват успешно или нищо не се изпълнява изобщо.
COMMIT
изявлението записва всички оператори.
Нека създадем име на таблица cities
без първичен ключ.
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)
Опитайте го
За да добавите първичен ключ към cities
таблица, изпълнявате следните стъпки:
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)
Опитайте го
Ако използвате инструмента на SQLite GUI, можете да използвате следния израз, за да покажете информацията за таблицата.
PRAGMA table_info([cities]);
Code language: SQL (Structured Query Language) (sql)
Опитайте го
В този урок се научихте да използвате SQLite PRIMARY KEY
ограничение за дефиниране на първичния ключ за таблица.