powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
32 сообщений из 32, показаны все 2 страниц
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #35788192
petya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две таблицы table1 и table2. Я хочу, чтобы table2 содержала поле, ссылающееся на первичный ключ table1, и при обновлении/удалении table1 автоматически обновлялись/удалялись записи table2.
С базой я работаю через утилиту sqlite3.
Таблицы я создаю следующим образом:
create table table1 ('name' CHAR(100) PRIMARY KEY);
create table table2 ('t2_name' CHAR(100) PRIMARY KEY REFERENCES table1(name) ON UPDATE CASCADE ON DELETE CASCADE);
Я заполняю таблицы и обновляю одну из записей table1, на первичный ключ которой ссылается одна из записей table2. При этом запись из table2 не изменяется. Что я делаю не так?
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #35789020
mmar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Using a CREATE TABLE statement

The syntax for creating a foreign key using a CREATE TABLE statement is:

CREATE TABLE table_name
(column1 datatype null/not null,
column2 datatype null/not null,
...
CONSTRAINT fk_column
FOREIGN KEY (column1, column2, ... column_n)
REFERENCES parent_table (column1, column2, ... column_n)
ON DELETE CASCADE
);

Хоть бы пост поменял, Петя;)
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #35791030
petya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mmar, спасибо
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #35791202
petya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
create table table1 ('name' CHAR(100) NOT NULL PRIMARY KEY);
create table table2 ('column1' CHAR(100) NOT NULL PRIMARY KEY,CONSTRAINT column1 FOREIGN KEY (column1) REFERENCES table1 (name) ON DELETE CASCADE);
insert into table1 (name) values ('123');
insert into table2 (column1) values ('123');
delete from table1;
select * from table2; - выводит добавленную двумя строками выше запись

Т.е., при удалении записи из table1 ссылающаяся запись из table2 не удаляется. Объясните пожалуйста, как создать внешний ключ правильно.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #35791990
mmar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это и есть правильный способ создания внешнего ключа. У меня в Оракле, как ни странно это работает..

Варианта 2:
1. Либо вы забыли указать COMMIT после удаления записи.
2. SQLite так делать не умеет.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #35792209
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petyacreate table table2 ('t2_name' CHAR(100) PRIMARY KEY REFERENCES table1(name) ON UPDATE CASCADE ON DELETE CASCADE);
Читай тут: http://www.sqlite.org/omitted.html
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #35793020
petya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, спасибо. Почему сам не догадался посмотреть на сайте разработчика СУБД, не знаю.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36256003
SunLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Читай тут: http://www.sqlite.org/omitted.html

На сайте разработчика в списке не поддерживаемой функциональности не указано каскадное обновление полей. В документации же заявлено.

CONSTRAINT FK_task_autor FOREIGN KEY (autor_id) REFERENCES people (people_id) ON DELETE CASCADE ON UPDATE CASCADE
Конструкция выполняется без ошибок, но обновление не происходит.
Подскажите пожалуйста, как добиться каскадного обновления полей!
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36256068
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 3.6.19 появилась полноценная поддержка FK .
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36256124
SunLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
3.6.19 - скачала
пункт "4.3 ON DELETE and ON UPDATE Actions" в FK изучила, но пример с артистами и треками воспроизвести не удалось.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
-- Database schema
CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER REFERENCES artist(artistid) ON UPDATE CASCADE
);

sqlite> SELECT * FROM artist;
artistid  artistname       
--------  -----------------
 1          Dean Martin      
 2          Frank Sinatra    

sqlite> SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
 11        That's Amore       1
12       Christmas Blues    1
13       My Way             2  

sqlite> -- Update the artistid column of the artist record for "Dean Martin".
sqlite> -- Normally, this would raise a constraint, as it would orphan the two
sqlite> -- dependent records in the track table. However, the ON UPDATE CASCADE clause
sqlite> -- attached to the foreign key definition causes the update to "cascade"
sqlite> -- to the child table, preventing the foreign key constraint violation.
sqlite> UPDATE artist SET artistid = 100 WHERE artistname = 'Dean Martin';

sqlite> SELECT * FROM artist;
artistid  artistname       
--------  -----------------
2         Frank Sinatra    
100       Dean Martin      

sqlite> SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
11       That's Amore        100 
 12        Christmas Blues     100   
 13        My Way              2   


Выполняется без ошибок, но конечного результата (после изменения первичного ключа в таблице artist) не увидела - в таблице track каскадных изменение не произошло.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36256157
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это может быть ?
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36256345
SunLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, установка
Код: plaintext
PRAGMA FOREIGN_KEYS=ON;
помогает. В консоли. А из сишной программы значение установить не удается :(
Использую sqlite3_exec для выполнения запроса. Сейчас пробую в явном виде использовать группу функций sqlite3_prepare(), sqlite3_step(), sqlite3_finalize().

Some pragmas take effect during the SQL compilation stage, not the execution stage. This means if using the C-language sqlite3_prepare(), sqlite3_step(), sqlite3_finalize() API (or similar in a wrapper interface), the pragma may run during the sqlite3_prepare() call, not during the sqlite3_step() call as normal SQL statements do. Or the pragma might run during sqlite3_step() just like normal SQL statements. Whether or not the pragma runs during sqlite3_prepare() or sqlite3_step() depends on the pragma and on the specific release of SQLite.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36256376
SunLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот, из программы устанавливается значение прагмы, только другой. Через sqlite3_exec()
Код: plaintext
PRAGMA encoding = "UTF-16";
А foreign_keys не хочет :(
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36256445
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И правда не включаются ключики через exec.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36256996
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlite3_prepare & sqlite3_step & sqlite3_finalize - включается. По исходникам видно, что
достаточно sqlite3_prepare вызова. parse.y напрямую вызывает sqlite3Pragma, которая и
устанавливает нужный флаг.

sqlite3_exec не пробовал. Но странно, что она не работает, так как sqlite3_exec есть
последовательность из sqlite3_prepare & sqlite3_step & sqlite3_finalize.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36257503
SunLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sqlite3_prepare & sqlite3_step & sqlite3_finalize, также как и sqlite3_exec(), устанавливает прагму с foreign_keys, из программы я вижу, что значение установлено (прагма включена), но из консоли этого по-прежнему не наблюдаю. Соответственно (как из программы, так из консоли) не происходит каскадного обновления.
И Бог с ним, с каскадированием, но при отключенных foreign_keys база позволяет удалять строки и модифицировать значения первичных ключей, на которые ссылаются записи из других таблиц :(
Подытожив:
Из консоли при включении foreign_keys они действительно включаются и работают.
Из программы при включении foreign_keys (двумя способами) они вроде как включаются (запрос PRAGMA FOREIGN_KEYS возвращает единичку), но не работают. В файле с базой с такими "включенными" из программы внешними ключами из консоли видно, что внешние ключи НЕ включены.

Как же все-таки правильно программно включить поддержку внешних ключей?
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36257639
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СержИ правда не включаются ключики через exec.Беру свои слова назад. Забыл про особенность программы автоматически закрывать соединение. Прагма устанавливается.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36257691
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SunLineВ файле с базой с такими "включенными" из программы внешними ключами из консоли видно, что внешние ключи НЕ включены.
Кажется мне, что ты считаешь, что PRAGMA FOREIGN_KEYS должно применяться к
БД. А оно применяется к сессии. Т.е. каждый раз после открытия БД надо выполнять
PRAGMA FOREIGN_KEYS.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36258966
SunLine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, с включением внешних ключей в начале каждой сессии все работает! Спасибо большое, что помогли разобраться!
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36260282
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievКажется мне, что ты считаешь, что PRAGMA FOREIGN_KEYS должно применяться к
БД. А оно применяется к сессии. Т.е. каждый раз после открытия БД надо выполнять
PRAGMA FOREIGN_KEYS.а кто-нибудь может объяснить мне смысл этого, мягко говоря, странного решения?
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36262622
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlа кто-нибудь может объяснить мне смысл этого, мягко говоря, странного решения?Вполне логично. Это ведь встраиваемый движок.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36262834
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СержWhite Owlа кто-нибудь может объяснить мне смысл этого, мягко говоря, странного решения?Вполне логично. Это ведь встраиваемый движок.И? Логика то в чем?
Встраиваемый или не встраиваемый движок это только на наличие дополнительно запускаемых процессов влияет. Структура базы данных от встраиваемости движка не меняется.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36263445
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В каких режимах работать базе данных определяет программист и сам решает где и как ему эти настройки хранить. Sqlite в этот процесс не вмешивается и ни как не ограничивает. Минимализм. В этом и логика.

Можно
1) Положить все свои настройки в базу и при открытии читать и устанавливать их.
2) Можно пересобрать длл с нужными установками.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36264409
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если PRAGM'у хранить в БД, то тогда не будет возможности несколькими
потоками работать с одной БД в разных состояниях одной прагмы. Т.е.
один поток делает загрузку с FOREIGN_KEYS = OFF, а другой тихо мирно
редактирует данные с FOREIGN_KEYS = ON - так не получится.

Другая причина - новый формат БД, со всеми вытекающими.

Правда это все довольно условные причины ...
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36265125
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievЕсли PRAGM'у хранить в БД, то тогда не будет возможности несколькими
потоками работать с одной БД в разных состояниях одной прагмы. Т.е.
один поток делает загрузку с FOREIGN_KEYS = OFF, а другой тихо мирно
редактирует данные с FOREIGN_KEYS = ON - так не получится.Получится запросто. Внешние ключи которые могут загружаться с временным нарушением связи объявляются как deferable и проблема загрузки больших объемов исчезает.
А выключать связи вообще это значит рисковать целостностью данных. При включении этой прагмы обратно, оно же не будет проверять загруженные данные на целостность.

Dmitry ArefievДругая причина - новый формат БД, со всеми вытекающими.
Правда это все довольно условные причины ...Там не новый формат вообще-то, там только дополнительные модули обработки данных при обновлениях.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36265212
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlПолучится запросто.
Получится, но ценой снижения производительности в случае, когда загружаются
данные из проверенного на 999% источника. DEFERABLE - это проверка валидности
переносится на конец транзакции, а в указанном случае ее бы отменить вообще.
White OwlТам не новый формат вообще-то, там только дополнительные модули обработки данных при обновлениях.
Я про сохранение статуса FOREIGN_KEYS в БД. Для этого потребуется хранить еще
один флаг.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36265379
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievWhite OwlПолучится запросто.
Получится, но ценой снижения производительности в случае, когда загружаются
данные из проверенного на 999% источника. DEFERABLE - это проверка валидности
переносится на конец транзакции, а в указанном случае ее бы отменить вообще.Зачем отменять??? Перенос на конец транзакции это самое правильное дело если данные могут загружаться из внешнего источника. Но выключать проверку вообще, это копать самому себе яму.
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #36266030
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНо выключать проверку вообще, это копать самому себе яму.
Если есть сомнения в правильности исходных данных - да. Если источник 300%
проверенный, то - нет. Вообще что тут спорить - авторам sqlite виднее, зачем они
так сделали. Мы же будем пользовать что есть и писать тикеты :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #37168124
как-то так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievWhite OwlНо выключать проверку вообще, это копать самому себе яму.
Если есть сомнения в правильности исходных данных - да. Если источник 300%
проверенный, то - нет. Вообще что тут спорить - авторам sqlite виднее, зачем они
так сделали. Мы же будем пользовать что есть и писать тикеты :)Ничего авторам не видней!
1) Ограничения - все, и локальные, и FK, - должны выполняться по-умолчанию.
2) Потратил энное кол-во времени и мозгов, чтобы найти причину. Как и положено, начинаю с себя и иду выше: сначала полагаю, что я что-то делаю не так, проверяю, что тот же самый запрос, выполненный в другой программе, работает. Хорошо, дело не в запросе. Смотрю, не мог ли "напахать" применяемый sqlwrapper. И только потом начинаю сомневаться в самой sqlite. Впервые в жизни вижу подход, когда по-умолчанию целостность данных приносится в жертву чему-то другому!

ПС Автор sqlite, конечно, авторитетный хакер, но зачем же правила дорожного движения нарушать :-)
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #37168511
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то такАвтор sqlite, конечно, авторитетный хакер, но зачем же правила дорожного движения нарушать :-)
Были нарушены не правила дорожного движения, а правила проверки документов на дорогах.
Долгое время было принято доверять всем проехавшим по дорогам ... Как в том анекдоте - и
гуссарам стало везти :)
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #37169113
как-то так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev,

Вы, как опытный товарищ, может быть, перечислите ещё какие-то вещи, которые сделаны "не как у всех", или "какие пункты в документации обязательны к прочтению" - для тех, кто приходит в sqlite, имея опыт работы в других СУБД.
А может, такой документ уже существует?
...
Рейтинг: 0 / 0
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
    #37169272
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такого документа в явном виде нет.

Читать в первую очередь следующее:
- типы данных - http://www.sqlite.org/datatype3.html
- конкурентный доступ - http://www.sqlite.org/lockingv3.html
- SQL синтаксис - http://www.sqlite.org/lang.html
- прагмы - http://www.sqlite.org/pragma.html

Про отличия:
- отличия SQL - http://www.sqlite.org/omitted.html
- отличия SQLite - http://www.sqlite.org/different.html

Короче говоря - http://www.sqlite.org/docs.html :)
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]