我试图向表中添加约束,以便表中只能有一条记录。
这是我已有的代码:
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:
这是如何运作的?
答案 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