PL / SQL约束:始终是表中的一条记录

时间:2015-05-30 15:37:19

标签: sql oracle

我试图向表中添加约束,以便表中只能有一条记录。

这是我已有的代码:

ALTER TABLE CONFIG
ADD CONSTRAINT always_one 
CHECK (count(*)= 1);

这就是我得到的错误

ALTER TABLE CONFIG
ADD CONSTRAINT always_one CHECK (count(*)= 1)
Error report -
SQL Error: ORA-00934: group function is not allowed here
00934. 00000 -  "group function is not allowed here"
*Cause:    
*Action:

这是如何运作的?

2 个答案:

答案 0 :(得分:1)

只需在表中的列上创建唯一索引,并添加一个约束,使此列的值必须为特定值。

例如

CREATE UNIQUE INDEX one_val ON config(pk_col);

ALTER TABLE CONFIG
ADD CONSTRAINT always_one 
CHECK (pk_col = 1);

如果您的所有其他列都可以是任何值,则可能只需添加此附加列,并为其指定默认值。

答案 1 :(得分:1)

您可以使用已提出的解决方案,在列

上添加唯一约束
alter table config add constraint always_one check (pk_col=1);
但是,如果pk_col在第二个插入行中为空,则允许插入多行。所以你需要通过添加NOT NULL约束来处理这个问题

ALTER TABLE config
ADD CONSTRAINT notnulc CHECK (pk_col IS NOT NULL) ;

为防止删除此行,您应该在删除触发器之前创建如下

create or replace trigger trg_ONLYONE before delete ON CONFIG 

DECLARE
 C NUMBER;
BEGIN
   SELECT COUNT(*) INTO C FROM CONFIG;

      if  (C=1) THEN
        RAISE_APPLICATION_ERROR (-20011, 'TOO FEW ROWS');
      END IF;


END;

其他选项是:代替上面提到的检查约束是CREATE BEFORE INSERT触发器,或者代替NOT NULL和UNIQUE CONSTRAINT使pk_col PRIMARY KEY