2011-09-15 61 views
0

嘿,所以我试图创建一个基于已经存在的新记录,但我很难确保此记录不存在。数据库存储事务的详细信息,并有一个是否重复的字段。SQLite创建一个新记录,如果它不存在

我使用

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

起初我想使用的SELECT代替INSERT只是为了调试目的生成新的日期。我试图用GROUP BYCOUNT(*)做些事情,但确切的逻辑是躲避我。因此,例如我试过

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) 

但这显然把两个表,虽然他们被加入了,它不记录追加到表的底部,这将让我组。

我一直在努力奋斗几天,所以任何帮助将不胜感激!

编辑: 该文档说“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。请参阅文档。

+0

请参阅我的编辑 – Josh

+0

请参阅@ Arvo的文字。另外,你可以创建一个合成的ID,比如说连接的transaction_id和date? – pupssman

+0

如果没有原生方式,综合ID是一个好主意 – Josh

相关问题