SQLite3 Table 如果最后一个值等于则不插入数据的约束

SQLite3 Table constraint for not inserting data if last value equals

我有一个简单的 SQLite 模式:

CREATE TABLE "test" (
  "id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  "data"  INTEGER NOT NULL
);

我想 限制插入 仅当新数据不等于基于 id DESC 的最后数据时。

因此,当将其作为数据时:

1|15
2|17

插入15应该成功,但应该跳过17。

我可以用 2 个查询来做到这一点,或者也可以用 1 个带有 cte 或一些连接的查询来做到这一点。但这在纯粹的 table 约束下可能吗?

我不认为SQLite可以设置这样的约束。
一种方法是这样的:

insert into tablename(data)
select ?
where ? <> coalesce((select data from tablename order by id desc limit 1), 0); 

? 占位符替换为您要插入的新值。
我使用 coalesce(..., 0),所以如果 table 中没有行,新值将与 0 进行比较。您可以将 0 更改为您知道永远不会出现在 data.

列中的值

参见demo

我找到了更好的方法:

要防止插入重复值,您可以做的实际上是在插入前创建一个简单的 TRIGGER

CREATE TRIGGER "preventor" 
BEFORE INSERT ON "test"
WHEN (SELECT data FROM "test" ORDER BY id DESC LIMIT 1) = NEW.data
BEGIN
  SELECT RAISE(ABORT, 'Duplicated value detected - insertion aborted');
END

NEW 是 SQLite 触发器中的关键字,它引用您要插入的新数据。