Ограничение SQLite
Что такое ограничение?
ОГРАНИЧЕНИЯ - это целостность, которая определяет некоторые условия, которые ограничивают столбец, содержащий истинные данные при вставке, обновлении или удалении. Мы можем использовать два типа ограничений: ограничение на уровне столбца или на уровне таблицы. Ограничения уровня столбца могут применяться только к определенному столбцу, где ограничения уровня таблицы могут применяться ко всей таблице.
Следующие ограничения столбцов, которые должны применяться при вставке данных:
- НЕНУЛЕВОЙ
- ОСНОВНОЙ КЛЮЧ
- УНИКАЛЬНАЯ
- ПРОВЕРЯТЬ
- ИНОСТРАННЫЙ КЛЮЧ
Оглавление
КОМПОЗИЦИОННЫЙ ИНОСТРАННЫЙ КЛЮЧ
скованность
ОГРАНИЧЕНИЯ - это целостность, которая определяет некоторые условия, которые ограничивают столбец, содержащий истинные данные при вставке, обновлении или удалении. Мы можем использовать два типа ограничений: ограничение на уровне столбца или на уровне таблицы. Ограничения уровня столбца могут применяться только к определенному столбцу, где ограничения уровня таблицы могут применяться ко всей таблице.
НЕНУЛЕВОЙ
Ограничение NOT NULL может быть присоединено только к определению столбца, но не указано как ограничение таблицы. Неудивительно, что ограничение NOT NULL указывает, что связанный столбец может не содержать значение NULL. Попытка установить значение столбца в NULL при вставке новой строки или обновлении существующей приводит к нарушению ограничения.
Пример:
sqlite> создать столовую компанию ( ...> com_id text (4) NOT NULL, ...> com_name text (15) NOT NULL);
Теперь рассмотрим использование оператора NOT NULL с CREATE TABLE. Смотрите список команд ниже:
, sqlite> INSERT INTO VALUES («COM1», «TS LTD.»); sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; COM1 | TS LTD. Никаких проблем не возникает во время вставки. sqlite> INSERT INTO VALUES ("COM1", ""); sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; COM1 | TS LTD. COM1 | Здесь также не возникает проблем во время вставки, хотя значение второго столбца пустое. sqlite> INSERT INTO VALUES ("COM1", NULL); Ошибка: ограничение NOT NULL не выполнено: company.com_name Но здесь, в приведенном выше, мы принудительно попытались ввести значение второго столбца NULL, произошло нарушение ограничения.
ОСНОВНОЙ КЛЮЧ
Если ключевые слова PRIMARY KEY добавляются в определение столбца, то первичный ключ для таблицы состоит из этого единственного столбца. если в качестве ограничения таблицы указано условие PRIMARY KEY, то первичный ключ таблицы состоит из списка столбцов, указанных как часть предложения PRIMARY KEY. Каждая строка в таблице с первичным ключом должна иметь уникальную комбинацию значений в столбцах первичного ключа. В целях определения уникальности значений первичного ключа значения NULL считаются отличными от всех других значений, включая другие значения NULL. В предложении CREATE TABLE нельзя использовать более одного предложения PRIMARY KEY. ПЕРВИЧНЫЙ КЛЮЧ является необязательным для обычных таблиц. Согласно стандарту SQL, PRIMARY KEY всегда должен подразумевать NOT NULL.
Пример:
sqlite> создать столовую компанию ( ...> com_id text (4) ПЕРВИЧНЫЙ КЛЮЧ, ...> com_name text (15) NOT NULL);
Здесь в вышеприведенном примере com_id - это единственный столбец PRIMARY KEY.
Команда PRAGMA может быть использована для просмотра структуры таблицы.
sqlite> .mode column sqlite> .header on SQLite> sqlite> PRAGMA table_info (компания); тип имени cid notnull dflt_value pk ---------- ---------- ---------- ---------- ---------- ---------- 0 com_id text (4) 0 1 1 com_name текст (15) 1 0
Теперь посмотрим на использование PRIMARY KEY.
sqlite> INSERT INTO VALUES (NULL, "TS LTD."); Здесь мы вставляем строку и значение для столбца com_id, равное NULL, и оно было принято, хотя com_id является PRIMARY KEY, поскольку SQLite допускает значения NULL в столбце PRIMARY KEY. sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; com_id com_name ---------- ---------- ТС ЛТД.
Сейчас,
sqlite> INSERT INTO VALUES («COM1», «TS LTD.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM2», «KMP CORP.»); sqlite> INSERT INTO VALUES («COM1», «TS LTD.»); Ошибка: УНИКАЛЬНОЕ ограничение не удалось: company.com_id
Здесь выше, первые две строки были вставлены, но в 3-й строке мы принудительно попытались ввести значение com_id COM1, которое уже существует, и это нарушает уникальность PRIMARY KEY, и появилось указанное выше сообщение об ошибке.
Рекомендуется использовать NOT NULL вместе с PRIMARY KEY во время создания PRIMARY KEY на уровне столбцов, чтобы сделать таблицу более безопасной и надежной.
Теперь мы собираемся применить два PRIMARY KEY в ограничении PRIMARY KEY на уровне столбцов, посмотрим результат -
sqlite> создать столовую компанию ( ...> com_id text (4) NOT NULL ПЕРВИЧНЫЙ КЛЮЧ, ...> com_name text (15) NOT NULL PRIMARY KEY); Ошибка: таблица "компания" имеет более одного первичного ключа
КОМПОЗИТНЫЙ ПЕРВИЧНЫЙ КЛЮЧ
Составной PRIMARY KEY - это сочетание нескольких столбцов PRIMARY KEY. Вот пример ниже -
sqlite> CREATE TABLE заказы ( ...> Текст ord_id (4) НЕ ПУСТО, ...> item_id text (4) NOT NULL, ...> дата_даты, ...> ord_qty целое число, ...> стоит целое число, ...> ПЕРВИЧНЫЙ КЛЮЧ (item_id, ord_date));
Чтобы увидеть структуру таблицы, используйте следующие команды.
sqlite> .mode column sqlite> .header on SQLite> sqlite> PRAGMA table_info (заказы); тип имени cid notnull dflt_value pk ---------- ---------- ---------- ---------- ---------- ---------- 0 ord_id текст (4) 1 0 1 item_id text (4) 1 1 2 ord_date date 0 2 3 ord_qty целое число 0 0 4 целое число 0 0
Из приведенной выше структуры таблицы видно, что столбцы item_id и ord_date совместно обрабатываются как первичный ключ, а это составной первичный ключ.
Сейчас,
sqlite> INSERT INTO Заказы ЗНАЧЕНИЯ («ORD1», «ITM1», «13.09.2014», 10 300); sqlite> INSERT INTO Заказы ЗНАЧЕНИЯ («ORD2», «ITM2», «22.08.2014», 12,300); sqlite> INSERT INTO Заказы ЗНАЧЕНИЯ («ORD3», «ITM1», «13.09.2014», 25 300); Ошибка: ограничение UNIQUE не выполнено: orders.item_id, orders.ord_date
Здесь выше первые две строки были вставлены, но в 3-й строке мы принудительно попытались ввести значение item_id «ITM1» и ord_date «13.09.2014», комбинация которых уже существует, и это нарушает Появилась уникальность PRIMARY KEY и вышеприведенного сообщения об ошибке.
УНИКАЛЬНАЯ
Ограничение UNIQUE аналогично ограничению PRIMARY KEY, за исключением того, что в одной таблице может быть любое количество ограничений UNIQUE. Для каждого ограничения UNIQUE в таблице каждая строка должна содержать уникальную комбинацию значений в столбцах, определенных ограничением UNIQUE. В целях ограничений UNIQUE значения NULL считаются отличными от всех других значений, включая другие значения NULL.
Пример:
sqlite> создать столовую компанию ( ...> com_id text (4) ПЕРВИЧНЫЙ КЛЮЧ НЕ НУЛЕЙ УНИКАЛЬНО, ...> com_name text (15) NOT NULL UNIQUE);
Здесь, в приведенном выше примере, ограничение UNIQUE добавлено в каждый столбец, но не может быть сделано в случае PRIMARY KEY, который мы видели ранее.
ПРОВЕРЯТЬ
Ограничение CHECK может быть присоединено к определению столбца, чтобы определить, что является допустимым значением для столбца. Во время вставки новой строки или обновления строки, проверьте значение для определенного столбца, нарушает ли оно условие, и если условие оценивает false, новая строка не будет вставлена или никакая строка не будет обновлена из-за нарушения ограничение.
Пример:
sqlite> CREATE TABLE item ( ...> item_id text (4) NOT NULL UNIQUE PRIMARY KEY, ...> item_desc text (20) NOT NULL, ...> целочисленное значение CHECK (скорость> 0 И скорость <100));
Здесь, в приведенном выше примере ограничение CHECK для столбца ставки, отметьте, что скорость должна быть положительным значением, а скорость не должна превышать 100 или более.
Сейчас,
sqlite> INSERT INTO item VALUES («ITM1», «Pea-n-Nut», 15); sqlite> INSERT INTO item VALUES («ITM2», «Cool Pesta», 0); Ошибка: ограничение CHECK не выполнено: элемент sqlite> INSERT INTO item VALUES («ITM3», «Crack-Munch», 110); Ошибка: ограничение CHECK не выполнено: элемент
Здесь при первой вставке в таблицу элементов возникают проблемы, но во второй и третьей вставках произошла ошибка, поскольку во второй вставке значение скорости определяют 0, которое нарушает ограничение CHECK, а при третьей вставке - значение ставка 110, что также нарушает ограничение CHECK
ИНОСТРАННЫЙ КЛЮЧ
FOREIGN KEY CONSTRAINT используется для обеспечения ссылочной целостности данных в одной таблице для соответствия значениям в другой таблице. Это может быть один столбец или список столбцов, который указывает на ПЕРВИЧНЫЙ КЛЮЧ другой таблицы. Единственное и полезное назначение FOREIGN KEY состоит в том, что будут отображаться только те значения, которые присутствуют в таблице первичного ключа. Для каждой строки в ссылочной таблице (таблица содержит FOREIGN KEY) внешний ключ должен соответствовать существующему первичному ключу в ссылочной таблице (таблица содержит PRIMARY KEY).
Пример:
sqlite> создать столовую компанию ( ...> com_id text (4) ПЕРВИЧНЫЙ КЛЮЧ НЕ НУЛЕЙ УНИКАЛЬНО, ...> com_name text (15) NOT NULL); sqlite> CREATE TABLE item ( ...> item_id text (4) NOT NULL UNIQUE PRIMARY KEY, ...> item_desc text (20) NOT NULL, ...> целочисленное значение NOT NULL, ...> com_id text (4) NOT NULL, ...> ИНОСТРАННЫЙ КЛЮЧ (com_id) ССЫЛКИ company (com_id));
Здесь, в приведенном выше примере, com_id - это ПЕРВИЧНЫЙ КЛЮЧ в таблице компании, то есть каждый com_id входит в таблицу один раз; и com_id в таблице элементов - это FOREIGN KEY, и это ссылка на PRIMARY KEY таблицы компании, это означает, что какое значение для столбца com_id существует в таблице компании, только эти значения могут входить в столбец com_id в таблице элементов. ,
Теперь вставьте записи в две таблицы и посмотрите:
sqlite> INSERT INTO VALUES («COM1», «TS LTD.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM2», «KMP CORP.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM3», «MBD INC.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM4», «TS LTD.»); После вставки приведена таблица ниже. sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; com_id com_name ---------- ---------- COM1 TS LTD. COM2 KMP CORP COM3 MBD INC. COM4 TS LTD. INSERT INTO item VALUES («ITM1», «Pea-n-Nut», 15, «COM1»); INSERT INTO item VALUES («ITM2», «Cool Pesta», 25, «COM3»); INSERT INTO item VALUES («ITM3», «Crack-Munch», 12, «COM1»); INSERT INTO item VALUES («ITM4», «Pepsi», 16, «COM2»); INSERT INTO item VALUES («ITM6», «Pea-n-Nut», 14, «COM2»); INSERT INTO item VALUES («ITM5», «Charlie Gold», 700, «COM4»); Здесь мы вставляем 6 строк. Теперь я собираюсь вставить 7-й ряд. Смотрите результаты - INSERT INTO item VALUES («ITM7», «Charlie Gold», 710, «COM6»); Никаких проблем не возникает, хотя «COM6» не существует в таблице компании. Поскольку поддержка внешнего ключа не была включена для сеанса базы данных, поэтому, если вы включили поддержку с помощью - sqlite> PRAGMA foreign_keys = ON; поддержка внешнего ключа будет включена. Теперь мы удаляем последнюю строку из таблицы элементов УДАЛИТЬ ИЗ элемента ГДЕ com_id = 'COM6'; Последние вставленные были удалены. Теперь мы выполняем следующую команду и видим результат: sqlite> INSERT INTO item VALUES («ITM7», «Charlie Gold», 710, «COM6»); Ошибка: ограничение FOREIGN KEY не выполнено Здесь во время вставки 7-й строки возникла ошибка с ошибкой ограничения FOREIGN KEY, так как значение «COM6» в ссылочном столбце com_id не существует в таблице компании. Вот таблица sqlite> SELECT * FROM item; item_id item_desc rate com_id ---------- ---------- ---------- ---------- ITM1 гороховый орех 15 COM1 ITM2 Cool Pesta 25 COM3 ITM3 Crack-Munc 12 COM1 ITM4 Pepsi 16 COM2 ITM6 гороховый орех 14 COM2 ITM5 Charlie Go 700 COM4
КОМПОЗИТНЫЙ ИНОСТРАННЫЙ КЛЮЧ
Ограничение COMPOSITE FOREIGN KEY - это ограничение, в котором дочерний и родительский ключи являются составными ключами, то есть два или более столбцов объединяются в родительской и дочерней таблицах как первичный ключ и внешний ключ соответственно.
sqlite> создать таблицу comp_mast ( ...> com_id text (4), ...> текст com_name (15), ...> текст prod_id (4), ...> ПЕРВИЧНЫЙ КЛЮЧ (com_id, prod_id)); sqlite> создать таблицу itm_mast ( ...> item_id text (4), ...> имя элемента text (15), ...> фабричный текст (4), ...> текст pro_type (4), ...> целое число pro_cost, ...> FOREIGN KEY (factory, pro_type) ССЫЛКИ comp_mast (com_id, prod_id));
НА УДАЛЕНИИ НА ОБНОВЛЕНИИ
Предложения ON DELETE и ON UPDATE вместе с FOREIGN KEY используются для настройки действий, выполняемых при удалении строк из родительской таблицы (ON DELETE) или при изменении значений родительских ключей существующих строк (ON UPDATE). Действие ON DELETE и ON UPDATE, связанное с каждым внешним ключом в базе данных, выполняет одно из таких действий, например «NO ACTION», «RESTRICT», «SET NULL», «SET DEFAULT» или «CASCADE».
НЕТ ДЕЙСТВИЙ: - Настройка «НЕТ ДЕЙСТВИЙ» означает только то, что: когда родительский ключ изменяется или удаляется из базы данных, никаких специальных действий не предпринимается.
ОГРАНИЧЕНИЕ: Действие «ОГРАНИЧЕНИЕ» означает, что приложению запрещено удалять (для ON DELETE RESTRICT) или изменять (для ON UPDATE RESTRICT) родительский ключ, если существует один или несколько дочерних ключей, сопоставленных с ним.
SET NULL : если настроенным действием является «SET NULL», то когда родительский ключ удаляется (для ON DELETE SET NULL) или модифицируется (для ON UPDATE SET NULL), столбцы дочерних ключей всех строк в дочерней таблице, которые сопоставлены к родительскому ключу установлены, чтобы содержать значения SQL NULL.
SET DEFAULT: действия «SET DEFAULT» аналогичны «SET NULL», за исключением того, что в каждом из столбцов дочернего ключа задано значение по умолчанию для столбцов вместо NULL.
CASCADE : действие "CASCADE" распространяет операцию удаления или обновления родительского ключа на каждый зависимый дочерний ключ. Для действия «ON DELETE CASCADE» это означает, что каждая строка в дочерней таблице, которая была связана с удаленной родительской строкой, также удаляется. Для действия «ON UPDATE CASCADE» это означает, что значения, хранящиеся в каждом зависимом дочернем ключе, модифицируются для соответствия новым значениям родительского ключа.
БЕЗДЕЙСТВИЕ:
Теперь, если мы обновим и удалим запись из таблицы компании, эффект не появится в элементе дочерней таблицы, потому что для записей DELETE и UPDATE не было установлено никаких действий. Если действие не указано явно, по умолчанию используется значение «НЕТ ДЕЙСТВИЯ». Вот пример
sqlite> CREATE TABLE company ( ...> com_id text (4) NOT NULL УНИКАЛЬНЫЙ ПЕРВИЧНЫЙ КЛЮЧ, ...> com_name text (15) NOT NULL); sqlite> INSERT INTO VALUES («COM1», «TS LTD.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM2», «KMP CORP.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM3», «MBD INC.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM4», «TS LTD.»); sqlite> CREATE TABLE item ( ...> item_id text (4) NOT NULL UNIQUE PRIMARY KEY, ...> item_desc text (20) NOT NULL, ...> целочисленное значение NOT NULL, ...> icom_id TEXT (4) NOT NULL, ...> ИНОСТРАННЫЙ КЛЮЧ (icom_id) ССЫЛКИ компании (com_id)); SQLite> sqlite> INSERT INTO item VALUES («ITM1», «Pea-n-Nut», 15, «COM1»); sqlite> INSERT INTO item VALUES («ITM2», «Cool Pesta», 25, «COM3»); sqlite> INSERT INTO item VALUES («ITM3», «Crack-Munch», 12, «COM1»); sqlite> INSERT INTO item VALUES («ITM4», «Pepsi», 16, «COM2»); sqlite> INSERT INTO item VALUES («ITM6», «Pea-n-Nut», 14, «COM2»); sqlite> INSERT INTO item VALUES («ITM5», «Charlie Gold», 700, «COM4»); sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; com_id com_name ---------- ---------- COM1 TS LTD. COM2 KMP CORP. COM3 MBD INC. COM4 TS LTD. sqlite> SELECT * FROM item; item_id item_desc rate icom_id ---------- ---------- ---------- ---------- ITM1 гороховый орех 15 COM1 ITM2 Cool Pesta 25 COM3 ITM3 Crack-Munc 12 COM1 ITM4 Pepsi 16 COM2 ITM6 гороховый орех 14 COM2 ITM5 Charlie Go 700 COM4 sqlite> ОБНОВЛЕНИЕ компании SET com_id = 'COM5' ГДЕ com_id = 'COM4'; sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; com_id com_name ---------- ---------- COM1 TS LTD. COM2 KMP CORP. COM3 MBD INC. COM5 TS LTD. sqlite> SELECT * FROM item; item_id item_desc rate icom_id ---------- ---------- ---------- ---------- ITM1 гороховый орех 15 COM1 ITM2 Cool Pesta 25 COM3 ITM3 Crack-Munc 12 COM1 ITM4 Pepsi 16 COM2 ITM6 гороховый орех 14 COM2 ITM5 Charlie Go 700 COM4 -> Здесь без изменений. sqlite> УДАЛИТЬ ИЗ КОМПАНИИ, ГДЕ com_id = 'COM2'; sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; com_id com_name ---------- ---------- COM1 TS LTD. COM3 MBD INC. COM5 TS LTD. sqlite> SELECT * FROM item; item_id item_desc rate icom_id ---------- ---------- ---------- ---------- ITM1 гороховый орех 15 COM1 ITM2 Cool Pesta 25 COM3 ITM3 Crack-Munc 12 COM1 ITM4 Pepsi 16 COM2 ITM6 Pea-n-Nut 14 COM2 -> Запись удалена из родительской таблицы, но не из дочерней.
CASCADE
Но, если определяет ON UPDATE CASCADE и ON DELETE CASCADE вместе с FOREIGN KEY, посмотрите, что происходит в следующих примерах:
sqlite> создать столовую компанию ( ...> com_id text (4) NOT NULL УНИКАЛЬНЫЙ ПЕРВИЧНЫЙ КЛЮЧ, ...> com_name text (15) NOT NULL); sqlite> CREATE TABLE item ( ...> item_id text (4) NOT NULL UNIQUE PRIMARY KEY, ...> item_desc text (20) NOT NULL, ...> целочисленное значение NOT NULL, ...> icom_id TEXT (4), ...> ИНОСТРАННЫЙ КЛЮЧ (icom_id) ...> ССЫЛКИ на компанию (com_id) ...> ОБНОВЛЕНИЕ КАСКАДА НА УДАЛИТЬ КАСКАДА); sqlite> INSERT INTO VALUES («COM1», «TS LTD.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM2», «KMP CORP.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM3», «MBD INC.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM4», «TS LTD.»); sqlite> INSERT INTO item VALUES («ITM1», «Pea-n-Nut», 15, «COM1»); sqlite> INSERT INTO item VALUES («ITM2», «Cool Pesta», 25, «COM3»); sqlite> INSERT INTO item VALUES («ITM3», «Crack-Munch», 12, «COM1»); sqlite> INSERT INTO item VALUES («ITM4», «Pepsi», 16, «COM2»); sqlite> INSERT INTO item VALUES («ITM6», «Pea-n-Nut», 14, «COM2»); sqlite> INSERT INTO item VALUES («ITM5», «Charlie Gold», 700, «COM4»); sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; com_id com_name ---------- ---------- COM1 TS LTD. COM2 KMP CORP. COM3 MBD INC. COM4 TS LTD. sqlite> SELECT * FROM item; item_id item_desc rate icom_id ---------- ---------- ---------- ---------- ITM1 гороховый орех 15 COM1 ITM2 Cool Pesta 25 COM3 ITM3 Crack-Munc 12 COM1 ITM4 Pepsi 16 COM2 ITM6 гороховый орех 14 COM2 ITM5 Charlie Go 700 COM4 sqlite> ОБНОВЛЕНИЕ компании SET com_id = 'COM5' ГДЕ com_id = 'COM4'; sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; com_id com_name ---------- ---------- COM1 TS LTD. COM2 KMP CORP. COM3 MBD INC. COM5 TS LTD. sqlite> SELECT * FROM item; item_id item_desc rate icom_id ---------- ---------- ---------- ---------- ITM1 гороховый орех 15 COM1 ITM2 Cool Pesta 25 COM3 ITM3 Crack-Munc 12 COM1 ITM4 Pepsi 16 COM2 ITM6 гороховый орех 14 COM2 ITM5 Charlie Go 700 COM5 Здесь в поле внешнего ключа 'icom_id', в дочерней таблице 'item', будет обновлено, чтобы соответствовать записи в родительской таблице 'company'. Здесь com_id в таблице компании, обновляемой с помощью 'COM5', а также дочерний ключ, т.е. icom_id отображаемых строк таблицы Чили, в зависимости от поле родительского ключа, т.е. com_id обновлено 'COM5'. sqlite> УДАЛИТЬ ИЗ КОМПАНИИ, ГДЕ com_id = 'COM2'; sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; com_id com_name ---------- ---------- COM1 TS LTD. COM3 MBD INC. COM5 TS LTD. sqlite> SELECT * FROM item; item_id item_desc rate icom_id ---------- ---------- ---------- ---------- ITM1 гороховый орех 15 COM1 ITM2 Cool Pesta 25 COM3 ITM3 Crack-Munc 12 COM1 ITM5 Charlie Go 700 COM5 Здесь будут удалены все строки из родительской таблицы, которые соответствуют условию, а также каждая строка в элементе дочерней таблицы, которая была связана с удаленным родительским ключом, также удаляется.
RESTRICT
sqlite> создать столовую компанию ( ...> com_id text (4) NOT NULL УНИКАЛЬНЫЙ ПЕРВИЧНЫЙ КЛЮЧ, ...> com_name text (15) NOT NULL); sqlite> CREATE TABLE item ( ...> item_id text (4) NOT NULL UNIQUE PRIMARY KEY, ...> item_desc text (20) NOT NULL, ...> целочисленное значение NOT NULL, ...> icom_id TEXT (4), ...> ИНОСТРАННЫЙ КЛЮЧ (icom_id) ...> ССЫЛКИ на компанию (com_id) ...> ОБНОВЛЕНИЕ ОБНОВЛЕНИЯ НА УДАЛЕНИЕ ОГРАНИЧЕНИЯ); sqlite> INSERT INTO VALUES («COM1», «TS LTD.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM2», «KMP CORP.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM3», «MBD INC.»); sqlite> ВСТАВЬТЕ В ЦЕННОСТИ компании («COM4», «TS LTD.»); sqlite> INSERT INTO item VALUES («ITM1», «Pea-n-Nut», 15, «COM1»); sqlite> INSERT INTO item VALUES («ITM2», «Cool Pesta», 25, «COM3»); sqlite> INSERT INTO item VALUES («ITM3», «Crack-Munch», 12, «COM1»); sqlite> INSERT INTO item VALUES («ITM4», «Pepsi», 16, «COM2»); sqlite> INSERT INTO item VALUES («ITM6», «Pea-n-Nut», 14, «COM2»); Вот таблицы: sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; com_id com_name ---------- ---------- COM1 TS LTD. COM2 KMP CORP. COM3 MBD INC. COM4 TS LTD. sqlite> SELECT * FROM item; item_id item_desc rate icom_id ---------- ---------- ---------- ---------- ITM1 гороховый орех 15 COM1 ITM2 Cool Pesta 25 COM3 ITM3 Crack-Munc 12 COM1 ITM4 Pepsi 16 COM2 ITM6 гороховый орех 14 COM2 sqlite> ОБНОВЛЕНИЕ компании SET com_id = 'COM5' ГДЕ com_id = 'COM3'; Ошибка: УНИКАЛЬНОЕ ограничение не удалось: company.com_id Вышеприведенное утверждение показывает, что приложению запрещено изменять родительский ключ com_id (COM3) с помощью COM5, когда существует один или несколько дочерних ключей (COM3), сопоставленных с ним. sqlite> ОБНОВЛЕНИЕ компании SET com_id = 'COM5' ГДЕ com_id = 'COM4'; sqlite> ВЫБРАТЬ * ОТ КОМПАНИИ; com_id com_name ---------- ---------- COM1 TS LTD. COM2 KMP CORP. COM3 MBD INC. COM5 TS LTD. Но этот пример показывает, что изменение происходит в родительской таблице, не нарушая дочернюю таблицу, поскольку в дочерней таблице такого значения для столбца родительского ключа не существует.
Предыдущий: Создать, Изменить, Удалить таблицу
Далее: создать, изменить, удалить индекс
Новый контент: Composer: менеджер зависимостей для PHP , R программирования