【问题标题】:SQLite create a new record if it doesn't exist如果 SQLite 不存在,则创建一条新记录
【发布时间】: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 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

【问题讨论】:

  • 您检查“此记录已存在”的标准是什么?您需要根据此条件创建唯一约束。
  • 唯一约束必须是所有列都可以是非唯一的,但如果除 date 之外的所有列都与另一条记录相同,则 date 列必须在子集中是唯一的具有除date 之外的所有列的记录。如果这有任何意义的话......
  • 这完全没有任何意义。请参阅上面的编辑 2。
  • 不能在 SQLite 中定义复合主键吗?像 PRIMARY KEY (field1, field2, ..., date)?这样,您可以使用 MERGE 命令,如果主键不匹配,则插入新记录;如果主键匹配,则更新记录。如果您将所有字段都包含在键中,那么它不会更新任何内容。
  • SQLite 没有 MERGE 命令。

标签: sql ios sqlite


【解决方案1】:

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。请参阅文档。

【讨论】:

  • 查看@Arvo 的文字。此外,您可以创建一个综合 ID,例如,连接 transaction_id 和日期?
猜你喜欢
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2014-03-17
相关资源
最近更新 更多