2

我想知道如何在表上添加数据库限制。我想将 Oracle 数据库中的表问题简化为

CREATE TABLE TEST_STUDENT
(

STUDENT VARCHAR2(30 CHAR),
SUBJECT VARCHAR2(38) ,
IS_LANG NUMBER(1,0)
);

学生可以有任意数量的科目,但其中只有一个可以是语言 (IS_LANG)。

有效数据是

Insert into TEST_STUDENT (STUDENT,SUBJECT,IS_LANG) values ('John','Math',);
Insert into TEST_STUDENT (STUDENT,SUBJECT,IS_LANG) values ('John','Science',);
Insert into TEST_STUDENT (STUDENT,SUBJECT,IS_LANG) values ('John','French',1);
Insert into TEST_STUDENT (STUDENT,SUBJECT,IS_LANG) values ('Lily','Math',);
Insert into TEST_STUDENT (STUDENT,SUBJECT,IS_LANG) values ('Lily','English',1);

但是,我应该不能像表格一样插入新数据,比如

Insert into TEST_STUDENT (STUDENT,SUBJECT,IS_LANG) values ('John','English',1);

或者

Insert into TEST_STUDENT (STUDENT,SUBJECT,IS_LANG) values ('Lily','French',1);

我不想在这里介绍触发器,除非它是唯一的方法。我希望有这个限制,因为在实际的软件中会有多个客户端实现试图将数据插入到这个表中。

4

1 回答 1

9

这是部分索引的一个很好的例子。

不幸的是,在 Oracle 中,您需要一种解决方法来实现部分索引(其他 DBMS 只允许WHERE应用一个子句):

create unique index idx_one_language 
   on test_student 
      (
          case when is_lang = 1 then student else null end
      );

这利用了 Oracle 不会索引所有列都为空的元组的事实。使用上面的表达式,只有IS_LANG = 1将为每个学生编制索引的行。由于索引被定义为唯一的,因此只能存在一个这样的行。

这是一个 SQLFiddle 示例:http ://sqlfiddle.com/#!4/43394d/1

于 2013-09-10T10:45:55.257 回答