Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / sqlite3. База данных / 9 сообщений из 9, страница 1 из 1
20.04.2015, 12:37
    #38940507
___ALBA___
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite3. База данных
Спроектировал базу данных.
Сформировал ее в 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
20.04.2015, 13:40
    #38940569
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite3. База данных
Может быть поэтому :
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
20.04.2015, 14:52
    #38940670
___ALBA___
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite3. База данных
я вводил эту команду перед созданием таблиц. Я думаю дело в самом заполнении...
...
Рейтинг: 0 / 0
20.04.2015, 15:01
    #38940683
ArtDen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite3. База данных
Это надо вводить и перед созданием таблиц и при любой работе с базой. Т.е. если ты просто откроешь базу и удалишь что-то из главной таблицы (без PRAGMA foreign_keys = ON), то в подчинённых таблицах контроль целостности внешнего ключа не отработает.
...
Рейтинг: 0 / 0
20.04.2015, 15:46
    #38940744
___ALBA___
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite3. База данных
я не закрывал базу.
ввел команду и все равно не работают каскады. Посмотрите, пожалуйста,заполнение таблиц, мне, кажется, это в нем дело.
...
Рейтинг: 0 / 0
20.04.2015, 15:54
    #38940753
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite3. База данных
А вот у меня всё работает. Тест на мёртвом языке. Библиотеку сам не перестраивал, взял бинарник на 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
20.04.2015, 16:01
    #38940766
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite3. База данных
* кроме SQLITE_OK и SQLITE_DONE, если быть точным
Тест tab2 -> tab3 делается заменой tab1 на tab2 в предпоследнем prepare. Он, разумеется, тоже завершается успешно.
...
Рейтинг: 0 / 0
21.04.2015, 03:20
    #38941186
___ALBA___
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite3. База данных
Версия моего sqlite3 3.6.11
Возможно что проблемы связаны с этим?
...
Рейтинг: 0 / 0
21.04.2015, 04:19
    #38941189
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlite3. База данных
Забавно, но по ходу может) В списке изменений утверждается, что " Added support for foreign key constraints " только начиная с 3.6.19. Это можно проверить - взять, например, свежую версию библиотеки и подсунуть в проект.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / sqlite3. База данных / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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