【发布时间】:2011-09-15 09:44:09
【问题描述】:
嘿,所以我正在尝试根据已存在的记录创建新记录,但我无法确保此记录不存在。数据库存储交易的详细信息,并具有是否重复的字段。
我正在使用
生成新日期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)
但这显然将两个表视为已连接,它不会将记录附加到表的底部,这会让我进行分组。
我已经苦苦挣扎了好几天,所以任何帮助都将不胜感激!
编辑: 文档说“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
【问题讨论】:
-
您检查“此记录已存在”的标准是什么?您需要根据此条件创建唯一约束。
-
唯一约束必须是所有列都可以是非唯一的,但如果除
date之外的所有列都与另一条记录相同,则date列必须在子集中是唯一的具有除date之外的所有列的记录。如果这有任何意义的话...... -
这完全没有任何意义。请参阅上面的编辑 2。
-
不能在 SQLite 中定义复合主键吗?像 PRIMARY KEY (field1, field2, ..., date)?这样,您可以使用 MERGE 命令,如果主键不匹配,则插入新记录;如果主键匹配,则更新记录。如果您将所有字段都包含在键中,那么它不会更新任何内容。
-
SQLite 没有 MERGE 命令。