2011-09-15 21 views
0

だから、既に存在するレコードに基づいて新しいレコードを作成しようとしていますが、このレコードが存在しないことを確認するのに問題があります。データベースにはトランザクションの詳細が格納され、それが繰り返されるかどうかのフィールドがあります。SQLiteが存在しない場合は新しいレコードを作成します

私は当初、私はちょうどデバッグ目的SELECT代わりINSERTのを使用したい

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

を使用して、新しい日付を生成しています。私は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) 

を試してみたが、これは明らかに、彼らが参加したかのように、それは私がグループ聞かせテーブルの下にレコードを追加していない2つのテーブルを扱います。

私は何日間も苦労しているので、どんな助けもありがとう!

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 
+0

「このレコードは既に存在しますか」を確認する基準は何ですか?この基準に基づいてユニークな制約を作成する必要があります。 – Arvo

+0

ユニークな制約は、すべての列が非ユニークであることができるようにする必要がありますが、 'date'以外のすべての列が別のレコードと同じ場合、' date'列は、 'date'列を除くすべての列を持つレコードのサブセットで一意でなければなりません。日付。それが意味をなさなければ... – Josh

+0

それは全く意味をなさない。上記の編集2を参照してください。 – Josh

答えて

0

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でもかまいません。 docsを参照してください。

+0

上記の編集を参照してください – Josh

+0

@ Arvoのテキストを参照してください。また、連結されたtransaction_idとdateの合成IDを作成できますか? – pupssman

+0

ネイティブな方法がない場合、合成IDは良いアイデアです – Josh

関連する問題