检查约束的默认值

时间:2016-02-21 18:57:47

标签: oracle

我陷入困境,无法弄清楚如何在oracle中将条件添加到CHECK约束中... 基本上我有一个具有以下结构的表:

CREATE TABLE TEST_TBL
(
    COL_1 VARCHAR2(100) NOT NULL,
    COL_2 VARCHAR2(100) NOT NULL,
    COL_3 VARCHAR2(100) NOT NULL,
    COL_4 VARCHAR2(100) NOT NULL,
    DEF_COL CHAR(1) DEFAULT 'Y',
    CONSTRAINT def_check_const
    CHECK (???????)
);

此表中可能有多个值,但我要求只能在DEF_COL列中输入“Y”或“N”。另外,我想添加一个约束来将DEF_COL列中的“Y”数限制为仅一个。 DEF_COL列可能有多个“N”条目。有人可以指导我在创建表查询的检查部分添加约束必须做些什么吗?

提前致谢....

1 个答案:

答案 0 :(得分:3)

Oracle安装程序

CREATE TABLE TEST_TBL(
    COL_1 VARCHAR2(100) NOT NULL,
    COL_2 VARCHAR2(100) NOT NULL,
    COL_3 VARCHAR2(100) NOT NULL,
    COL_4 VARCHAR2(100) NOT NULL,
    DEF_COL CHAR(1)     DEFAULT 'Y'
                        CONSTRAINT def_check_const
                          CHECK ( DEF_COL IN ('Y', 'N' ) )
);

CREATE UNIQUE INDEX def_col_only_one_y__U
  ON TEST_TBL( CASE DEF_COL WHEN 'Y' THEN 'Y' END );

插入行

INSERT INTO TEST_TBL VALUES ( 'A1', 'A2', 'A3', 'A4', 'Y' );

1 rows inserted.

使用DEF_COL = 'Y' 插入第二列:

INSERT INTO TEST_TBL VALUES ( 'B1', 'B2', 'B3', 'B4', 'Y' )

Error report -
SQL Error: ORA-00001: unique constraint (TEST.DEF_COL_ONLY_ONE_Y__U) violated
00001. 00000 -  "unique constraint (%s.%s) violated"
*Cause:    An UPDATE or INSERT statement attempted to insert a duplicate key.
           For Trusted Oracle configured in DBMS MAC mode, you may see
           this message if a duplicate entry exists at a different level.
*Action:   Either remove the unique restriction or do not insert the key.

<强>更新

对于3列的每个唯一组合,只有一个Y,请尝试:

CREATE UNIQUE INDEX C1_2_3__def_col_only_one_y__U
      ON TEST_TBL( COL1, COL2, COL3, CASE DEF_COL WHEN 'Y' THEN 'Y' END );