![]() Интернет, компьютеры, софт и прочий Hi-Tech | ||||||
Избранные докиМетки (все метки)hi tech, internet, it, software, интернет, информационные технологии, ит, по, программное обеспечение, софт
Подписаться через RSS2Email.ru
|
Поддержка внешних ключей в SQLite![]() Содержание
5. Команды CREATE, ALTER и DROP TABLEЭта глава описывает особенности выполнения команд CREATE TABLE, ALTER TABLE и DROP TABLE при наличии внешних ключей SQLite. Команда CREATE TABLE производит одни и те же операции как при включённых внешних ключах, так и при отключённых. Объявление родительского ключа для внешнего ключа не проверяется при создании таблицы. Ничто не остановит пользователя при создании такого внешнего ключа, который ссылается на несуществующую родительскую таблицу или на несуществующие столбцы родительского ключа или на не совпадающие множества столбцов PRIMARY KEY или ограничения UNIQUE. При включённом ограничении внешнего ключа команда ALTER TABLE будет работать со следующими двумя особенностями:
Если внешние ключи включены когда выполняется команда DROP TABLE, то перед удалением таблицы эта команда выполняет скрытый DELETE для удаления всех строк этой таблицы. Скрытый DELETE не приводит к выполнению каких-либо SQL-триггеров, но может применять действия внешнего ключа или нарушить его ограничение. Если нарушается ограничение немедленного внешнего ключа, команда DROP TABLE терпит неудачу и таблица не удаляется. Если же нарушается ограничение отложенного внешнего ключа, то сообщение об ошибке будет выдано, когда пользователь попытается завершить транзакцию, если к тому времени нарушения ограничения внешнего ключа еще будут иметь место. Любые ошибки «foreign key mismatch», случившиеся в ходе выполнения скрытого DELETE, игнорируются. Рассмотренные расширения действий команд ALTER TABLE и DROP TABLE направлены на то, чтобы при включённых внешних ключах их невозможно было использовать для создания базы данных, содержащей неправильные внешние ключи. Но есть одно исключение из этого правила. Если родительский ключ не является субъектом PRIMARY KEY или ограничения UNIQUE, объявленных как часть определения родительской таблицы, а являются субъектом ограничения UNIQUE, возникшего при создании индекса командой CREATE INDEX, то дочерняя таблица может быть заполнена без возникновения ошибки «foreign key mismatch». Если этот индекс UNIQUE удаляется из схемы базы, то родительская таблица также удаляется без какого либо сообщения об ошибке. Тем не менее, база данных может оказаться в том состоянии, когда дочерняя таблица внешнего ключа содержит строки, которые не ссылаются на какие либо строки родительской таблицы. Этого случая можно избежать, если в качестве родительских ключей в схеме базы данных использовать только PRIMARY KEY или ограничения UNIQUE, объявленные как часть определения родительской таблицы, а не внешние индексы UNIQUE. Перечисленные выше свойства команд DROP TABLE и ALTER TABLE имеют место только при включённой поддержке внешних ключей. Если пользователь считает их нежелательными, то с помощью «PRAGMA foreign_keys» может отключить внешние ключи перед выполнением команд DROP или ALTER TABLE. Разумеется, после того как внешние ключи будут отключены, ничто не помешает пользователю нарушить ограничения внешних ключей и создать внутренние противоречия в базе данных. 6. Допустимые пределы и неподдерживаемые возможностиВ этой главе перечисляются некоторые предельные ограничения и нереализованные возможности, которые не были упомянуты в других местах.
Перевод: Дмитрий Скоробогатов, 18.09.2011 Предыдущие публикации: Последнее редактирование: 2011-09-18 06:01:37 Метки материала: table, sqlite, drop table, поддержка внешних ключей, документация для программиста, по, it, базы данных, софт, sql, программирование, soft, software, разработка по, программное обеспечение, db, информационные технологии, ит, программное обеспечение по Оставьте, пожалуйста, свой комментарий к публикации |
© 2007-2019, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.