В этом учебном пособии вы узнаете, как создать, добавить, и удалить primary key в SQLite с синтаксисом и примерами.
Описание
В SQLite первичный ключ - это отдельное поле или комбинация полей, однозначно определяющая запись. Таблица может иметь только один первичный ключ.
СОВЕТ. Хотя стандарты SQL-89 и SQL-92 не допускают значения NULL в первичном ключе, SQLite разрешает использование NULL при определенных обстоятельствах. Мы настоятельно рекомендуем не использовать значение NULL в первичном ключе.
Создать первичный ключ (оператор CREATE TABLE)
Первичный ключ может быть создан при выполнении оператора CREATE TABLE в SQLite.
Синтаксис
Синтаксис для создания первичного ключа с помощью оператора CREATE TABLE в SQLite:
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
CONSTRAINT constraint_name PRIMARY KEY (pk_col1, pk_col2, ... pk_col_n)
);
ИЛИ
(
column1 datatype CONSTRAINT constraint_name PRIMARY KEY,
column2 datatype [ NULL | NOT NULL ],
...
);
table_name
Имя таблицы, которую вы хотите создать.
column1, column2
Столбцы, которые вы хотите создать в таблице.
constraint_name
Название первичного ключа.
pk_col1, pk_col2, ... pk_col_n
Столбцы, составляющие первичный ключ.
Пример
Рассмотрим пример того, как создать первичный ключ, используя оператор CREATE TABLE в SQLite. Мы начнем с очень простого, где наш первичный ключ состоит всего из одного столбца.
Например:
1 2 3 4 5 6 7 |
CREATE TABLE employees ( employee_id INTEGER, last_name VARCHAR NOT NULL, first_name VARCHAR, hire_date DATE, CONSTRAINT employees_pk PRIMARY KEY (employee_id) ); |
В этом примере мы создали первичный ключ для таблицы employee, называемый employee_pk. Он состоит только из одного столбца - employee_id.
Мы могли бы использовать альтернативный синтаксис и создать этот же первичный ключ следующим образом:
1 2 3 4 5 6 |
CREATE TABLE employees ( employee_id INTEGER PRIMARY KEY, last_name VARCHAR NOT NULL, first_name VARCHAR, hire_date DATE ); |
Оба эти синтаксиса действительны при создании первичного ключа только с одним полем.
Если вы создаете первичный ключ, состоящий из 2 или более столбцов, вы ограничены использованием только первого синтаксиса, в котором первичный ключ определен в конце оператора CREATE TABLE.
Например:
1 2 3 4 5 6 |
CREATE TABLE customers ( last_name VARCHAR NOT NULL, first_name VARCHAR NOT NULL, address VARCHAR, CONSTRAINT customers_pk PRIMARY KEY (last_name, first_name) ); |
В этом примере создается первичный ключ в таблице customers под названием customers_pk, который состоит из комбинации столбцов last_name и first_name. Таким образом, каждая комбинация last_name и first_name должна быть уникальной в таблице customers.
Добавить первичный ключ
Если ваша таблица уже существует и вы хотите добавить первичный ключ позже, вы не можете использовать оператор ALTER TABLE для создания первичного ключа. Вместо этого вы должны создать новую таблицу с первичным ключом и скопировать данные в эту новую таблицу.
Синтаксис
Синтаксис для добавления первичного ключа в таблицу в SQLite:
BEGIN TRANSACTION;
ALTER TABLE table_name RENAME TO old_table;
CREATE TABLE table_name
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
CONSTRAINT constraint_name PRIMARY KEY (pk_col1, pk_col2, ... pk_col_n)
);
INSERT INTO table_name SELECT * FROM old_table;
COMMIT;
PRAGMA foreign_keys=on;
table_name
Имя таблицы для изменения. Это таблица, к которой вы хотите добавить первичный ключ.
old_table
Имя исходной таблицы, которое будет оставлено после создания новой таблицы с добавленным первичным ключом.
constraint_name
Название первичного ключа.
pk_col1, pk_col2, ... pk_col_n
Столбцы, составляющие первичный ключ.
Пример
Рассмотрим пример того, как добавить первичный ключ в существующую таблицу в SQLite. Скажем так, у нас уже есть таблица employees со следующим определением:
1 2 3 4 5 6 |
CREATE TABLE employees ( employee_id INTEGER, last_name VARCHAR NOT NULL, first_name VARCHAR, hire_date DATE ); |
И мы хотели добавить первичный ключ в таблицу employees, которая состоит из employee_id. Мы могли бы запустить следующие команды:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
PRAGMA foreign_keys=off; BEGIN TRANSACTION; ALTER TABLE employees RENAME TO old_employees; CREATE TABLE employees ( employee_id INTEGER, last_name VARCHAR NOT NULL, first_name VARCHAR, hire_date DATE, CONSTRAINT employees_pk PRIMARY KEY (employee_id) ); INSERT INTO employees SELECT * FROM old_employees; COMMIT; PRAGMA foreign_keys=on; |
В этом примере мы создали первичный ключ для таблицы employees с именем employee_pk, который состоит из столбца employee_id. Исходная таблица все еще будет существовать в базе данных с именем old_employees. Вы можете удалить таблицу old_employees после того, как убедитесь, что таблица employees и её данные соответствуют ожиданиям.
1 |
DROP TABLE old_employees; |
Удалить первичный ключ
В SQLite вы не можете использовать оператор ALTER TABLE для удаления первичного ключа. Вместо этого вы должны создать новую таблицу с удаленным первичным ключом и скопировать данные в эту новую таблицу.
Синтаксис
Синтаксис для удаления первичного ключа из таблицы в SQLite:
BEGIN TRANSACTION;
ALTER TABLE table_name RENAME TO old_table;
CREATE TABLE table_name
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
);
INSERT INTO table_name SELECT * FROM old_table;
COMMIT;
PRAGMA foreign_keys=on;
table_name
Имя таблицы для изменения. Это таблица, из которой вы хотите удалить первичный ключ.
old_table
Имя исходной таблицы, которое останется после создания новой таблицы с удаленным первичным ключом.
Пример
Рассмотрим пример удаления первичного ключа из существующей таблицы в SQLite. Скажем так, у нас уже есть таблица suppliers со следующим определением:
1 2 3 4 5 6 7 |
CREATE TABLE suppliers ( supplier_id INTEGER, supplier_name VARCHAR NOT NULL, address VARCHAR, city VARCHAR, CONSTRAINT suppliers_pk PRIMARY KEY (supplier_id) ); |
И мы хотели убрать первичный ключ из таблицы suppliers. Мы могли бы запустить следующие команды:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
PRAGMA foreign_keys=off; BEGIN TRANSACTION; ALTER TABLE suppliers RENAME TO old_suppliers; CREATE TABLE suppliers ( supplier_id INTEGER, supplier_name VARCHAR NOT NULL, address VARCHAR, city VARCHAR ); INSERT INTO suppliers SELECT * FROM old_suppliers; COMMIT; PRAGMA foreign_keys=on; |
В этом примере мы удалили первичный ключ в существующей таблице suppliers. Исходная таблица все еще будет существовать в базе данных с именем old_suppliers. Вы можете удалить таблицу old_suppliers после того, как убедитесь, что таблица suppliers и данные соответствуют ожидаемым.
1 |
DROP TABLE old_suppliers; |