В этом учебном пособии вы узнаете, как создать, добавить, и удалить unique constraints в SQLite с синтаксисом и примерами.
Описание
Уникальное ограничение - это отдельное поле или комбинация полей, однозначно определяющая запись. Некоторые поля могут содержать нулевые значения, если комбинация значений является уникальной.
В чем разница между уникальным ограничением и первичным ключом?
Первичный ключ | Уникальное ограничение |
---|---|
"Ни одно из полей, являющихся частью первичного ключа, не может содержать значение NULL.
(Хотя стандарты SQL-89 и SQL-92 не допускают значения NULL в первичном ключе, SQLite допускает NULL при определенных обстоятельствах. Мы настоятельно рекомендуем не использовать значение NULL в первичном ключе.)" |
Некоторые поля, являющиеся частью ограничения уникальности, могут содержать значения NULL, если комбинация значений уникальна. |
Создать уникальное ограничение
Уникальное ограничение может быть создано при выполнении оператора CREATE TABLE в SQLite.
Синтаксис
Синтаксис для создания уникального ограничения с помощью оператора CREATE TABLE в SQLite:
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
CONSTRAINT constraint_name UNIQUE (uc_col1, uc_col2, ... uc_col_n)
);
table_name
Имя таблицы, которую вы хотите создать.
column1, column2
Столбцы, которые вы хотите создать в таблице.
constraint_name
Имя уникального ограничения.
uc_col1, uc_col2, ... uc_col_n
Столбцы, которые составляют уникальное ограничение.
Пример
Рассмотрим пример того, как создать уникальное ограничение в SQLite.
1 2 3 4 5 6 7 |
CREATE TABLE employees ( employee_id INTEGER PRIMARY KEY AUTOINCREMENT, last_name VARCHAR NOT NULL, first_name VARCHAR, hire_date DATE, CONSTRAINT name_unique UNIQUE (last_name, first_name) ); |
В этом примере мы создали уникальное ограничение для таблицы employees с именем name_unique. Он состоит из полей last_name и first_name.
Добавить уникальное ограничение
Если ваша таблица уже существует и вы хотите добавить уникальное ограничение позже, вы не можете использовать оператор 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 UNIQUE (uc_col1, uc_col2, ... uc_col_n)
);
INSERT INTO table_name SELECT * FROM old_table;
COMMIT;
PRAGMA foreign_keys=on;
table_name
Имя таблицы для изменения. Это таблица, к которой вы хотите добавить уникальное ограничение.
old_table
Название оригинальной таблицы. Оно останется после того, как вы создадите новую таблицу с добавленным уникальным ограничением.
constraint_name
Имя уникального ограничения.
uc_col1, uc_col2, ... uc_col_n
Столбцы, которые составляют уникальное ограничение.
Пример
Рассмотрим пример того, как добавить уникальное ограничение к существующей таблице в SQLite. Скажем так, у нас уже есть таблица products со следующим определением:
1 2 3 4 5 |
CREATE TABLE products ( product_id INTEGER PRIMARY KEY AUTOINCREMENT, product_name VARCHAR NOT NULL, quantity INTEGER NOT NULL DEFAULT 0 ); |
И мы хотели добавить уникальное ограничение в таблицу products, которая состоит из product_name. Мы могли бы запустить следующие команды:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
PRAGMA foreign_keys=off; BEGIN TRANSACTION; ALTER TABLE products RENAME TO old_products; CREATE TABLE products ( product_id INTEGER PRIMARY KEY AUTOINCREMENT, product_name VARCHAR NOT NULL, quantity INTEGER NOT NULL DEFAULT 0, CONSTRAINT product_name_unique UNIQUE (product_name) ); INSERT INTO products SELECT * FROM old_products; COMMIT; PRAGMA foreign_keys=on; |
В этом примере мы создали уникальное ограничение для таблицы products с именем product_name_unique, которое состоит из столбца product_name. Исходная таблица все еще будет существовать в базе данных с именем old_products. Вы можете удалить таблицу old_products после того, как убедитесь, что таблица products и данные соответствуют ожиданиям.
1 |
DROP TABLE old_products; |
Удалить уникальное ограничение
В 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 PRIMARY KEY AUTOINCREMENT, supplier_name VARCHAR NOT NULL, address VARCHAR, city VARCHAR, CONSTRAINT supplier_name_unique UNIQUE (supplier_name) ); |
И мы хотели убрать уникальное ограничение из таблицы suppliers. Мы могли бы запустить следующие команды:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
PRAGMA foreign_keys=off; BEGIN TRANSACTION; ALTER TABLE suppliers RENAME TO old_suppliers; CREATE TABLE suppliers ( supplier_id INTEGER PRIMARY KEY AUTOINCREMENT, 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; |