您可以使用表约束(取决于 SQL 引擎——不清楚您使用的是哪一个)来确保没有太多特定类型的元组。
在火鸟 2.1 下:
fb> CREATE TABLE so2587151 (
> a VARCHAR(16) NOT NULL,
> b VARCHAR(16) NOT NULL,
> c VARCHAR(1) NOT NULL CHECK (c in ('T', 'F')),
> CONSTRAINT so2587151_only_one_false CHECK ( -- begin CONSTRAINT
> NOT EXISTS ( SELECT a, b, COUNT('x')
> FROM so2587151
> WHERE c = 'F'
> GROUP BY 1, 2
> HAVING COUNT('x') >= 1 )
> ) -- end CONSTRAINT
> );
fb> INSERT INTO so2587151(a,b,c) VALUES ('foo', 'bar', 'T');
fb> INSERT INTO so2587151(a,b,c) VALUES ('foo', 'bar', 'T');
fb> INSERT INTO so2587151(a,b,c) VALUES ('foo', 'bar', 'F');
fb> INSERT INTO so2587151(a,b,c) VALUES ('foo', 'bar', 'F');
Error: Operation violates CHECK constraint on view or table
-Operation violates CHECK constraint SO2587151_ONLY_ONE_FALSE on view or table SO2587151
-At trigger 'CHECK_15'
fb> SELECT * FROM so2587151;
A | B | C
==============
foo | bar | T
foo | bar | T
foo | bar | F
正如您从约束违反错误消息中看到的那样,这是根据 Firebird 的底层触发机制实现的。