检查约束以防止 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
如果使用 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;
我有一个 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
如果使用 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;