检查约束以防止 2 行或更多行的数值为 1

Check constraint to prevent 2 or more rows from having numeric value of 1

我有一个 SQL table 有一个名为 [applied] 的列,所有行中只有一行可以应用(值为 1)所有其他行的值应为 0

是否有我可以编写的检查约束来强制这种情况?

要准确了解如何编写触发器来帮助您,需要您使用的数据库的信息。

您将需要一个触发器作为您的测试控件:

 SELECT COUNT(APPLIED) 
 FROM TEST
 WHERE APPLIED = 1

如果大于 0,则不允许插入,否则允许。

虽然这可以通过触发器和约束来完成,但它们可能需要索引。相反,考虑加入 table.

create table things_applied (
  id smallint primary key default 1,
  thing_id bigint references things(id) not null,
  check(id = 1)
);

因为主键是唯一的,there can only ever be one row.

第一个是用插入激活的。

insert into things_applied (thing_id) values (1);

通过更新行来更改它。

update things_applied set thing_id = 2;

要完全停用,请删除该行。

delete things_applied;

要查找活动行,请加入 table。

select t.*
from things t
join things_applied ta on ta.thing_id = t.id

要检查它是否处于活动状态,请计算行数。

select count(id) as active
from things_applied

Try it.

如果使用 null 而不是 0,会容易得多。

具有 CHECK 约束以确保(非空)值 = 1。还有 UNIQUE 约束以仅允许单个值 1。

create table testtable (
    id int primary key,
    applied int,
    constraint applied_unique unique (applied),
    constraint applied_eq_1 check (applied = 1)
);

核心 ANSI SQL,即预期可与 任何 数据库一起使用。

大多数数据库支持过滤索引:

create unique index unq_t_applied on t(applied) where applied = 1;