SQLite создает новую запись, если она не существует - PullRequest
0 голосов
/ 15 сентября 2011

Эй, я пытаюсь создать новую запись на основе уже существующей, но у меня возникают проблемы с обеспечением того, что эта запись еще не существует. База данных хранит детали транзакций и имеет поле для повторения.

Я генерирую новые даты, используя

SELECT datetime(transactions.date, '+'||repeattransactions.interval||' days') 
AS 'newdate' FROM transactions, repeattransactions WHERE 
transactions.repeat = repeattransactions.id

Изначально я хотел бы использовать SELECT вместо INSERT только для целей отладки. Я пытался что-то сделать с GROUP BY или COUNT(*), но точная логика ускользает от меня. Так, например, я пытался

SELECT * FROM transactions, (SELECT transactions.id, payee, category, amount, 
fromaccount, repeat, datetime(transactions.date, 
'+'||repeattransactions.interval||' days') AS 'date' FROM transactions,
repeattransactions WHERE transactions.repeat = repeattransactions.id)

но это, очевидно, обрабатывает две таблицы так, как будто они объединены, и не добавляет записи в конец таблицы, что позволило бы мне сгруппировать.

Я боролся в течение нескольких дней, поэтому любая помощь будет признательна!

EDIT: В документах сказано: «Предложение ON CONFLICT применяется к ограничениям UNIQUE и NOT NULL». У меня не может быть уникального ограничения для таблицы по определению, так как мне нужно создать точно такую ​​же запись для новой транзакции с новой датой. Или я неверно истолковал это?

EDIT2:

id        payee     repeat      date
1         jifoda    7           15/09/2011
2         jifoda    7           22/09/2011  <-- allowed as date different within subset
3         grefa     1           15/09/2011  <-- allowed as only date is not-unique
4         grefa     1           15/09/2011  <-- not allowed! exactly same as id 3

1 Ответ

0 голосов
/ 15 сентября 2011

SQLite имеет специальный оператор DDL для дубликатов. Как:

create table test(a TEXT UNIQUE ON CONFLICT IGNORE);
insert into test values (1);
insert into test values (1);
select count(*) from test;
1

Это может быть также ON CONFLICT REPLACE. Смотри документы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...