LINUX.ORG.RU

Чудит SQLite в Qt (Полное игнорирование NOT NULL, ON DELETE SET DEFAULT и т.д.)

 , ,


0

2

Ребята, столкнулся с непонятной для меня проблемой.

Смотрите, таблица создается так:

CREATE TABLE tbl_transaction (
    id              INTEGER  PRIMARY KEY AUTOINCREMENT
                             UNIQUE
                             NOT NULL,
    name            STRING   NOT NULL,
    description     STRING,
    datetime        DATETIME NOT NULL,
    amount          DECIMAL  DEFAULT (0),
    id_cash_account INTEGER  REFERENCES tbl_cash_accounts (id) ON DELETE SET DEFAULT
                                                               ON UPDATE CASCADE
                             NOT NULL 
                             DEFAULT (1),
    id_category     INTEGER  REFERENCES tbl_category (id) ON DELETE SET DEFAULT
                                                          ON UPDATE CASCADE
                             NOT NULL
                             DEFAULT (1) 
);

То есть, при удалении строки и таблицы id_cash_account - в таблице tbl_transaction в столбце «id_cash_account» появится значение 1 вместо того, что было. Например, допустим таблица tbl_transaction содержит строку:

id = '1'
name = 'test'
description = ''
datetime = '21.07.12 03:08:12'
amount = '3'
id_cash_account = '33'
id_category = '66'

Тогда, если в таблице tbl_cash_accounts мы удаляем строку с id = 33

DELETE FROM tbl_cash_accounts
      WHERE id = '33';

то запись в таблице tbl_transaction должна превратиться в:

id = '1'
name = 'test'
description = ''
datetime = '21.07.12 03:08:12'
amount = '3'
id_cash_account = '1'
id_category = '66'

Так и происходит, если я в СУБД напишу такой запрос, но если я напишу такой запрос и выполню его в Qt - query->exec(textQuery);, то запись в таблице tbl_cash_accounts конечно удалится, а вот значение в tbl_transaction останется прежним - 33.

И проблема не только в этом, к примеру, запросы из Qt так же игнорируют NOT NULL столбцы (то есть из самой субд я пустое значение вставить не могу в таблицу, а если этот же запрос выполнить через QSqlQuery, то оно выполнит вставку без ошибок и отобразит значение в субд)

Я первый раз с таким столкнулся. В чем проблема может быть, господа?

То есть, опять же, как вы видите, в таблице tbl_transaction целых пять столбцов NOT NULL

И если средствами Qt (query->exec) выполнить этот запрос:

INSERT INTO tbl_transaction (id, name, description, datetime, amount, id_cash_account, id_category) VALUES ('0','','','','0','0','0');

ОНО ЕГО ВЫПОЛНИТ! И в СУБД отобразит строку:

id = '0'
name = ''
description = ''
datetime = ''
amount = '0'
id_cash_account = '0'
id_category = '0'

Это уже не говоря о том, как оно на место связей умудрилось нули впихнуть! Мне это просто выносит мозг



Последнее исправление: boganet9993 (всего исправлений: 2)

И если средствами Qt (query->exec) выполнить этот запрос:
INSERT INTO tbl_transaction (id, name, description, datetime, amount, id_cash_account, id_category) VALUES ('0','','','','0','0','0');
ОНО ЕГО ВЫПОЛНИТ! И в СУБД отобразит строку:

  1. запросы выполняет движек sqlite, так что такой же запрос отрабатывает и в консольном клиенте
  2. тут нет NULL значений, т.к. 0 это не NULL. А вот как уже не катит:
sqlite> INSERT INTO tbl_transaction (id, name, description, amount, id_cash_account, id_category) VALUES ('0','','','','0','0');
Error: NOT NULL constraint failed: tbl_transaction.datetime
  1. возможно надо включить PRAGMA foreign_keys = ON
xgatron
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.