powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / sqlite3. База данных
9 сообщений из 9, страница 1 из 1
sqlite3. База данных
    #38940507
___ALBA___
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спроектировал базу данных.
Сформировал ее в sqlite3
Помогите разобраться почему не работают связи и каскадное удаление. В чем ошибка?
Имеем 3 таблицы:
tab1: Название дисциплины(*), Название области знания
tab2: ФИО автора учебника(*), Название книги, Издательство, Год
tab3: ФИО автора учебника, Название дисциплины, Количество экземпляров, Заключение
(ФИО автора и название дисциплины - внешние ключи )
SQL-скрипт формирования базы данных:
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE tab1(dis text NOT NULL UNIQUE, oblzn text NOT NULL, PRIMARY KEY(dis));
CREATE TABLE tab2(fio text NOT NULL UNIQUE, name_kn text NOT NULL, izd text, god INT NOT NULL, PRIMARY KEY(fio));
CREATE TABLE tab3(fio text NOT NULL UNIQUE REFERENCES tab2(fio) ON UPDATE cascade ON DELETE cascade, 
dis text NOT NULL UNIQUE REFERENCES tab1(dis) ON UPDATE cascade ON DELETE cascade, 
ekz INT NOT NULL, zacl text NOT NULL, 
FOREIGN KEY(dis) REFERENCES tab1(dis), FOREIGN KEY(fio) REFERENCES tab2(fio));



Модератор: Тема перенесена из форума "MySQL".
...
Рейтинг: 0 / 0
sqlite3. База данных
    #38940569
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть поэтому :
Assuming the library is compiled with foreign key constraints enabled, it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command. For example:

sqlite> PRAGMA foreign_keys = ON;

Foreign key constraints are disabled by default (for backwards compatibility), so must be enabled separately for each database connection.
...
Рейтинг: 0 / 0
sqlite3. База данных
    #38940670
___ALBA___
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я вводил эту команду перед созданием таблиц. Я думаю дело в самом заполнении...
...
Рейтинг: 0 / 0
sqlite3. База данных
    #38940683
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это надо вводить и перед созданием таблиц и при любой работе с базой. Т.е. если ты просто откроешь базу и удалишь что-то из главной таблицы (без PRAGMA foreign_keys = ON), то в подчинённых таблицах контроль целостности внешнего ключа не отработает.
...
Рейтинг: 0 / 0
sqlite3. База данных
    #38940744
___ALBA___
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я не закрывал базу.
ввел команду и все равно не работают каскады. Посмотрите, пожалуйста,заполнение таблиц, мне, кажется, это в нем дело.
...
Рейтинг: 0 / 0
sqlite3. База данных
    #38940753
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот у меня всё работает. Тест на мёртвом языке. Библиотеку сам не перестраивал, взял бинарник на sqlite.org. Использовал свою минимальную обёртку над чистым API (в основном для приведения типа). Если API возвращает что-либо кроме SQLITE_OK - в обёртке тут же возбуждается исключение. Т.е. проход до последнего ShowMessage гарантирует, что БД всё съела и не подавилась.
наколеношный тест внешнего ключа tab3->tab1
Код: pascal
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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
constructor TForm1.Create(AOwner: TComponent);
var
  Params: TSQLite3DatabaseConnectParams;
begin
  inherited;
  FConn := TSQLite3Connection.Create;
  with Params do
  begin
    Readonly := False;
    CanCreateNew := True;
    SharedCache := True;
    ThreadingMode := tmSerialized;
    EnableURI := True;
  end;
  FConn.Connect(':memory:', Params);
end;

destructor TForm1.Destroy;
begin
  FConn.Free;
  inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  PRGForeignKeysOn =
    'PRAGMA foreign_keys = ON; ';

  DDLTemplate =
    'CREATE TABLE tab1(' +
     'dis text NOT NULL UNIQUE, ' +
     'oblzn text NOT NULL, ' +
     'PRIMARY KEY(dis)); ' +

    'CREATE TABLE tab2(' +
      'fio text NOT NULL UNIQUE, ' +
      'name_kn text NOT NULL, ' +
      'izd text, ' +
      'god INT NOT NULL, ' +
      'PRIMARY KEY(fio)); ' +

    'CREATE TABLE tab3(' +
      'fio text NOT NULL UNIQUE ' +
        'REFERENCES tab2(fio) ' +
        'ON UPDATE cascade ON DELETE cascade, ' +
      'dis text NOT NULL UNIQUE ' +
        'REFERENCES tab1(dis) ' +
        'ON UPDATE cascade ON DELETE cascade, ' +
      'ekz INT NOT NULL, ' +
      'zacl text NOT NULL, ' +
      'FOREIGN KEY(dis) REFERENCES tab1(dis), ' +
      'FOREIGN KEY(fio) REFERENCES tab2(fio));';

  DMLInhabitateTab1 =
    'INSERT INTO tab1(dis, oblzn) ' +
    'VALUES (:dis, :oblzn);';

  DMLInhabitateTab2 =
    'INSERT INTO tab2(fio, name_kn, izd, god) ' +
    'VALUES (:fio, :name_kn, :izd, :god);';

  DMLInhabitateTab3 =
    'INSERT INTO tab3(fio, dis, ekz, zacl) ' +
    'VALUES (:fio, :dis, :ekz, :zacl);';

  DMLSelectCountFrom =
    'SELECT COUNT(*) AS CNT FROM %s;';

  DMLDeleteAllFromTab =
    'DELETE FROM %s;';

begin
  with FConn.NewQuery do
    try
      Prepare(PRGForeignKeysOn);
      Execute;

      Prepare(DDLTemplate);
      repeat
        Execute;
      until not PrepareNext;

      ShowMessage('DDL is Ok!');

      Prepare(DMLInhabitateTab1);
      Params.ParamByName('dis').SetAsString('Êîïàíèå');
      Params.ParamByName('oblzn').SetAsString('Íàóêè î çåìëå');
      Execute;

      Prepare(DMLInhabitateTab2);
      Params.ParamByName('fio').SetAsString('Êîïàëêèí Ê.Î.');
      Params.ParamByName('name_kn').SetAsString('Êîïàíèå ÿì ñåáå íà ãîëîâó');
      Params.ParamByName('izd').SetAsString('Èçä-âî ÂåíäåÊàïåö');
      Params.ParamByName('god').SetAsInteger(2015);
      Execute;

      Prepare(DMLInhabitateTab3);
      Params.ParamByName('fio').SetAsString('Êîïàëêèí Ê.Î.');
      Params.ParamByName('dis').SetAsString('Êîïàíèå');
      Params.ParamByName('ekz').SetAsInteger(1);
      Params.ParamByName('zacl').SetAsString('×òî òóò ñêàçàòü!');
      Execute;

      Prepare(Format(DMLSelectCountFrom, ['tab1']));
      Execute;
      Assert(Fields.Count = 1);
      Assert(Fields[0].AsInteger = 1);

      Prepare(Format(DMLSelectCountFrom, ['tab2']));
      Execute;
      Assert(Fields.Count = 1);
      Assert(Fields[0].AsInteger = 1);

      Prepare(Format(DMLSelectCountFrom, ['tab3']));
      Execute;
      Assert(Fields.Count = 1);
      Assert(Fields[0].AsInteger = 1);

      ShowMessage('Inhabitation is Ok!');

      Prepare(Format(DMLDeleteAllFromTab, ['tab1']));
      Execute;

      Prepare(Format(DMLSelectCountFrom, ['tab3']));
      Execute;
      Assert(Fields.Count = 1);
      Assert(Fields[0].AsInteger = 0);

      ShowMessage('FK from tab3 to tab1 is Ok!');
    finally
      Free;
    end;
end;


...
Рейтинг: 0 / 0
sqlite3. База данных
    #38940766
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
* кроме SQLITE_OK и SQLITE_DONE, если быть точным
Тест tab2 -> tab3 делается заменой tab1 на tab2 в предпоследнем prepare. Он, разумеется, тоже завершается успешно.
...
Рейтинг: 0 / 0
sqlite3. База данных
    #38941186
___ALBA___
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия моего sqlite3 3.6.11
Возможно что проблемы связаны с этим?
...
Рейтинг: 0 / 0
sqlite3. База данных
    #38941189
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забавно, но по ходу может) В списке изменений утверждается, что " Added support for foreign key constraints " только начиная с 3.6.19. Это можно проверить - взять, например, свежую версию библиотеки и подсунуть в проект.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / sqlite3. База данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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