oracle check约束定义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle check约束定义相关的知识,希望对你有一定的参考价值。

字符型,7位长;主关键字。编码规则:地名汉语拼音前5位+顺序编号
定义一下这个 我用的
CREATE TABLE "AUDITUSER"."TORKPLACE" ("TLACEID" CHAR(7),
CHECK(tLACEID LIKE
'[A-Z][A-Z][A-Z][A-Z][A-Z]%'))
TABLESPACE "TBS_POSTDATA_DATA1"
可以建表但是插入不了数据 违反约束了 我是ORACLE 9i 检查约束应该怎样定义啊

oracle的check约束可以实现对字段的内容输入进行控制。

举例如下:

create table test
(id int primary key,
name varchar2(20),
sex varchar2(2) check (sex in (\'男\',\'女\')));

如上边语句,代表性别(sex)列只允许为男或女,如果输入其他内容则会报错。

如图:

参考技术A create table y_5(id varchar2(7),
check (regexp_like(id,'^[A-Z]5,')));

------------------------------------补充-----------------------------------
忘了你的数据库是9i的 没有regexp_like函数。 那就有点麻烦了。
我个人想的办法:
create table y7(id varchar2(7),
check (ascii(substr(id,1,1)) between 65 and 90
and ascii(substr(id,2,1)) between 65 and 90
and ascii(substr(id,3,1)) between 65 and 90
and ascii(substr(id,4,1)) between 65 and 90
and ascii(substr(id,5,1)) between 65 and 90
));

测试:
SQL> insert into y7 values('123abc');

insert into y7 values('123abc')

ORA-02290: 违反检查约束条件 (TEST2.SYS_C007263)

SQL> insert into y7 values('abcefg');

insert into y7 values('abcefg')

ORA-02290: 违反检查约束条件 (TEST2.SYS_C007263)

SQL> insert into y7 values('ABC');

1 row inserted

SQL> insert into y7 values('ABCEFG8');

1 row inserted

SQL> COMMIT;

Commit complete

SQL> insert into y7 values(null);

1 row inserted

SQL> commit;

可以插入null值 已经类似ABC不足5位的也能插入。需要改进

create table y8(id varchar2(7),
check (ascii(substr(id,1,1)) between 65 and 90 and substr(id,1,1) is not null
and ascii(substr(id,2,1)) between 65 and 90 and substr(id,2,1) is not null
and ascii(substr(id,3,1)) between 65 and 90 and substr(id,3,1) is not null
and ascii(substr(id,4,1)) between 65 and 90 and substr(id,4,1) is not null
and ascii(substr(id,5,1)) between 65 and 90 and substr(id,5,1) is not null
));

SQL> insert into y8 values('ABC');

insert into y8 values('ABC')

ORA-02290: 违反检查约束条件 (TEST2.SYS_C007264)

SQL> insert into y8 values('abc');

insert into y8 values('abc')

ORA-02290: 违反检查约束条件 (TEST2.SYS_C007264)

SQL> insert into y8 values('12abc');

insert into y8 values('12abc')

ORA-02290: 违反检查约束条件 (TEST2.SYS_C007264)

SQL> insert into y8 values('ABCEF');

1 row inserted

SQL> COMMIT;

Commit complete

初次之外,我再没想出更好的办法。本回答被提问者采纳
参考技术B 约束的概念:
约束是在表中定义的用于维护数据库完整性的一些规则。通过为表中的字段定义约束,可以防止将错误的数据插入到表中。

检查约束(check)
检查约束的特点:
在检查约束的表达式中必须引用到表中的一个或多个字段,并且表达式的计算结果必须是一个布尔值。
在表达式中不能包含子查询。
在表达式中不能包含sysdate,uid,user,userenv等sql函数,也不能包含rowid,rownum等伪列。
检查约束可以在字段级和表级定义。
对同一个字段可以定义多个检查约束,而且对同一个字段可以同时定义检查约束和非空约束。
例如:
create table person
(
p_id int,
p_name varchar2(20),
p_age int check(p_age > 20)
);

insert into person values(1,'1',11);

create table person2
(
p_id int,
p_name varchar2(20),
p_age int constraint p_check2 check(p_age > 20)
);

insert into person2 values(1,'1',11);

create table person3
(
p_id int,
p_name varchar2(20),
p_age int,
constraint p_check3 check(p_age > 20)
);

insert into person3 values(1,'1',11);

通过以上我写的小例子,我想你就可以明白了,希望可以帮到你!

Oracle SQL - 我可以在 DDL 的 CHECK 约束中使用子查询吗?

【中文标题】Oracle SQL - 我可以在 DDL 的 CHECK 约束中使用子查询吗?【英文标题】:Oracle SQL - Can I use sub-query in a CHECK constraint in DDL? 【发布时间】:2020-10-23 16:13:54 【问题描述】:

我正在使用 Oracle SQL,我想知道在创建新表时是否可以在 CHECK 约束中使用子查询。请考虑以下示例:

假设我想创建一个名为EnrollsIn 的表,它有两个属性——studentcoursestudent 是一个包含唯一学生 ID 的字符串,course 属性包含一个课程代码字符串。

CREATE TABLE EnrollsIn (
   student char(8) PRIMARY KEY,
   course char(7),
   -- Insert constraint here (Constraint is written below)
);

INSERT INTO EnrollsIn VALUE ('12345678', 'COMP200');
INSERT INTO EnrollsIn VALUE ('12345678', 'COMP300');
INSERT INTO EnrollsIn VALUE ('12345678', 'COMP400');
INSERT INTO EnrollsIn VALUE ('12345678', 'MATH100');  -- This violates the constraint written below!

现在,我希望此表有一个约束,即单个学生最多只能注册 3 门课程。换句话说,对于每个student,以下查询的值应该始终为enrollCount

-- I want the value "enrollCount" always <= 3 for all students
SELECT student, count(*) as enrollCount FROM EnrollsIn GROUP BY student;

CERATE TABLE EnrollsIn 语句中定义 CHECK 约束时,我可以使用这个子查询吗?如果是这样,我该如何定义这个约束?

【问题讨论】:

唉,你不能在检查约束中这样做。这种结构称为 SQL 断言,Oracle 或任何其他主要数据库尚不支持它,尽管已经采取措施增加支持。 实现此要求的一种方法是使用复合触发器:有关示例,请参见 this answer。或者,您可以创建一个带有检查约束的物化视图:there is an example here。 @APC:我不确定复合触发方法是否适用。如果您在两个并发会话中的每一个中为同一个学生插入两行,触发器将永远不会检测到问题,因为它只会看到每个会话中的两行,而不是所有四行,所以你肯定会得到那个学生注册了四门课程? 顺便提一下,Oracle 为字符串提供了varchar2char 用于固定长度的字符串,nobody has ever needed,使用它经常会产生错误。 @LukeWoodward - 这是一个有效的观点。为了使复合触发器工作,我们需要锁定 STUDENT 记录,该记录将过程序列化。在生产环境中并不理想,但对于家庭作业解决方案来说还可以(我一直认为这是学生入学问题的情况:D) 【参考方案1】:

最好向documentation询问:

检查约束的限制

检查约束受以下限制:

检查约束条件不能包含以下结构: 子查询和标量子查询表达式 调用用户定义的函数

【讨论】:

以上是关于oracle check约束定义的主要内容,如果未能解决你的问题,请参考以下文章

oracle约束总结(not null/unique/primary key/foreign key/check)

ORACLE里的CHECK约束。。

[Oracle]约束(constraint)

oracle 唯一约束 为啥 唯一索引

oracle约束

Oracle 检查约束check