кодесурса
«SQLite

Ограничение SQLite

script1adsense2code
script1adsense3code

Что такое ограничение?

ОГРАНИЧЕНИЯ - это целостность, которая определяет некоторые условия, которые ограничивают столбец, содержащий истинные данные при вставке, обновлении или удалении. Мы можем использовать два типа ограничений: ограничение на уровне столбца или на уровне таблицы. Ограничения уровня столбца могут применяться только к определенному столбцу, где ограничения уровня таблицы могут применяться ко всей таблице.

Следующие ограничения столбцов, которые должны применяться при вставке данных:

  • НЕНУЛЕВОЙ
  • ОСНОВНОЙ КЛЮЧ
  • УНИКАЛЬНАЯ
  • ПРОВЕРЯТЬ
  • ИНОСТРАННЫЙ КЛЮЧ

Оглавление

скованность

ОСНОВНОЙ КЛЮЧ

КОМПОЗИТНЫЙ ПЕРВИЧНЫЙ КЛЮЧ

УНИКАЛЬНАЯ

ПРОВЕРЯТЬ

ИНОСТРАННЫЙ КЛЮЧ

КОМПОЗИЦИОННЫЙ ИНОСТРАННЫЙ КЛЮЧ

НА УДАЛЕНИИ

БЕЗДЕЙСТВИЕ

CASCADE

RESTRICT

скованность

ОГРАНИЧЕНИЯ - это целостность, которая определяет некоторые условия, которые ограничивают столбец, содержащий истинные данные при вставке, обновлении или удалении. Мы можем использовать два типа ограничений: ограничение на уровне столбца или на уровне таблицы. Ограничения уровня столбца могут применяться только к определенному столбцу, где ограничения уровня таблицы могут применяться ко всей таблице.

НЕНУЛЕВОЙ

Ограничение 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 программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code