|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
Есть две таблицы 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 не изменяется. Что я делаю не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2009, 14:28 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
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 ); Хоть бы пост поменял, Петя;) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2009, 20:40 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
mmar, спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2009, 11:13 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
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 не удаляется. Объясните пожалуйста, как создать внешний ключ правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2009, 12:07 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
Это и есть правильный способ создания внешнего ключа. У меня в Оракле, как ни странно это работает.. Варианта 2: 1. Либо вы забыли указать COMMIT после удаления записи. 2. SQLite так делать не умеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2009, 16:43 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
petyacreate table table2 ('t2_name' CHAR(100) PRIMARY KEY REFERENCES table1(name) ON UPDATE CASCADE ON DELETE CASCADE); Читай тут: http://www.sqlite.org/omitted.html ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2009, 17:45 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
White Owl, спасибо. Почему сам не догадался посмотреть на сайте разработчика СУБД, не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2009, 10:19 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
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 Конструкция выполняется без ошибок, но обновление не происходит. Подскажите пожалуйста, как добиться каскадного обновления полей! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2009, 15:03 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
В 3.6.19 появилась полноценная поддержка FK . ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2009, 15:18 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
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.
Выполняется без ошибок, но конечного результата (после изменения первичного ключа в таблице artist) не увидела - в таблице track каскадных изменение не произошло. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2009, 15:35 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
Это может быть ? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2009, 15:43 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
Да, установка Код: plaintext
Использую 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2009, 16:48 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
Вот, из программы устанавливается значение прагмы, только другой. Через sqlite3_exec() Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2009, 16:59 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
И правда не включаются ключики через exec. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2009, 17:23 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
sqlite3_prepare & sqlite3_step & sqlite3_finalize - включается. По исходникам видно, что достаточно sqlite3_prepare вызова. parse.y напрямую вызывает sqlite3Pragma, которая и устанавливает нужный флаг. sqlite3_exec не пробовал. Но странно, что она не работает, так как sqlite3_exec есть последовательность из sqlite3_prepare & sqlite3_step & sqlite3_finalize. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2009, 09:57 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
sqlite3_prepare & sqlite3_step & sqlite3_finalize, также как и sqlite3_exec(), устанавливает прагму с foreign_keys, из программы я вижу, что значение установлено (прагма включена), но из консоли этого по-прежнему не наблюдаю. Соответственно (как из программы, так из консоли) не происходит каскадного обновления. И Бог с ним, с каскадированием, но при отключенных foreign_keys база позволяет удалять строки и модифицировать значения первичных ключей, на которые ссылаются записи из других таблиц :( Подытожив: Из консоли при включении foreign_keys они действительно включаются и работают. Из программы при включении foreign_keys (двумя способами) они вроде как включаются (запрос PRAGMA FOREIGN_KEYS возвращает единичку), но не работают. В файле с базой с такими "включенными" из программы внешними ключами из консоли видно, что внешние ключи НЕ включены. Как же все-таки правильно программно включить поддержку внешних ключей? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2009, 22:45 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
СержИ правда не включаются ключики через exec.Беру свои слова назад. Забыл про особенность программы автоматически закрывать соединение. Прагма устанавливается. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2009, 06:04 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
SunLineВ файле с базой с такими "включенными" из программы внешними ключами из консоли видно, что внешние ключи НЕ включены. Кажется мне, что ты считаешь, что PRAGMA FOREIGN_KEYS должно применяться к БД. А оно применяется к сессии. Т.е. каждый раз после открытия БД надо выполнять PRAGMA FOREIGN_KEYS. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2009, 11:17 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
Да, с включением внешних ключей в начале каждой сессии все работает! Спасибо большое, что помогли разобраться! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2009, 11:46 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
Dmitry ArefievКажется мне, что ты считаешь, что PRAGMA FOREIGN_KEYS должно применяться к БД. А оно применяется к сессии. Т.е. каждый раз после открытия БД надо выполнять PRAGMA FOREIGN_KEYS.а кто-нибудь может объяснить мне смысл этого, мягко говоря, странного решения? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2009, 17:32 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
White Owlа кто-нибудь может объяснить мне смысл этого, мягко говоря, странного решения?Вполне логично. Это ведь встраиваемый движок. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 17:31 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
СержWhite Owlа кто-нибудь может объяснить мне смысл этого, мягко говоря, странного решения?Вполне логично. Это ведь встраиваемый движок.И? Логика то в чем? Встраиваемый или не встраиваемый движок это только на наличие дополнительно запускаемых процессов влияет. Структура базы данных от встраиваемости движка не меняется. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2009, 18:46 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
В каких режимах работать базе данных определяет программист и сам решает где и как ему эти настройки хранить. Sqlite в этот процесс не вмешивается и ни как не ограничивает. Минимализм. В этом и логика. Можно 1) Положить все свои настройки в базу и при открытии читать и устанавливать их. 2) Можно пересобрать длл с нужными установками. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2009, 09:52 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
Если PRAGM'у хранить в БД, то тогда не будет возможности несколькими потоками работать с одной БД в разных состояниях одной прагмы. Т.е. один поток делает загрузку с FOREIGN_KEYS = OFF, а другой тихо мирно редактирует данные с FOREIGN_KEYS = ON - так не получится. Другая причина - новый формат БД, со всеми вытекающими. Правда это все довольно условные причины ... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2009, 14:34 |
|
Внешний ключ в sqlite3. Каскадирование. Хочу, чтобы автоматически обновлялись/удалялись с
|
|||
---|---|---|---|
#18+
Dmitry ArefievЕсли PRAGM'у хранить в БД, то тогда не будет возможности несколькими потоками работать с одной БД в разных состояниях одной прагмы. Т.е. один поток делает загрузку с FOREIGN_KEYS = OFF, а другой тихо мирно редактирует данные с FOREIGN_KEYS = ON - так не получится.Получится запросто. Внешние ключи которые могут загружаться с временным нарушением связи объявляются как deferable и проблема загрузки больших объемов исчезает. А выключать связи вообще это значит рисковать целостностью данных. При включении этой прагмы обратно, оно же не будет проверять загруженные данные на целостность. Dmitry ArefievДругая причина - новый формат БД, со всеми вытекающими. Правда это все довольно условные причины ...Там не новый формат вообще-то, там только дополнительные модули обработки данных при обновлениях. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2009, 17:41 |
|
|
start [/forum/topic.php?fid=54&msg=36257691&tid=2009215]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
72ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 329ms |
total: | 505ms |
0 / 0 |