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 触发器中的关键字,它引用您要插入的新数据。
我有一个简单的 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 触发器中的关键字,它引用您要插入的新数据。