Oracle 19C学习 |
您所在的位置:网站首页 › oracle常用的约束 › Oracle 19C学习 |
什么是约束
约束就是在表上强制执行的规则。约束可以防止存在相关性时产生误删除或者误操作。 Oracle包括以下约束: NOT NULL 非空约束,此列不允许有空值。 UNIQUE 唯一约束,不能有重复项。 PRIMARY KEY 主键约束,一个表具有标识性的列,非空且唯一。 FOREIGN KEY 外键约束,在列和被引用的表的列之间建立一个外键关系。 CHECK 检查约束,当条件满足时,才能向改列插入数据或者更新数据。 约束的相关规则: 约束的名字描述性好 可以在一下任何时刻创建约束: 创建表的时候创建 创建表后,可以补充约束的定义 可以在列或者表级别定义约束。 可以在数据字典中查看相关约束的定义。 定义列级约束引用一个列,并在有用列的范围内定义,可以定义任何类型的约束条件。 CREATE TABLE TEST_1 ( ID number(6) PRIMARY KEY, NAME VARCHAR2(50)); 定义表级约束引用一个或者多个列,并在该表的列定义中分别进行定义,可以定义除了NOT NULL的任何约束。 -- 先创建列,再定义约束 CREATE TABLE TEST_2 ( ID NUMBER(6), FIRST_NAME VARCHAR2(50), CONSTRAINT TEST_2_ID_PK PRIMARY KEY (ID)); 非空约束的定义CREATE TABLE NAME ( FIELD_NAME TYPE NOT NULL); 或者 CREATE TABLE NAME( FIELD_NAME TYPE CONTRAINT TABLE_COLNAME_NN NOT NULL); CREATE TABLE TEST_4 ( ID NUMBER NOT NULL , NAME VARCHAR2(40) CONSTRAINT NAME_NN NOT NULL); 唯一键UNIQUE约束CREATE TABLE NAME ( FIELD_NAME TYPE UNIQUE); 或者 CREATE TABLE NAME( FIELD_NAME TYPE CONTRAINT NAME_UK UNIQUE); CREATE TABLE TEST_5( ID NUMBER UNIQUE, NAME VARCHAR2(50) CONSTRAINT TABLE_COLNAME_UK UNIQUE); 主键PRIMARY KEY约束CREATE TABLE NAME ( FIELD_NAME TYPE PRIMARY KEY); 或者 CREATE TABLE NAME( FIELD_NAME TYPE CONTRAINT TABLE_COLNAME_PK PRIMARY KEY); CREATE TABLE TEST_6 ( ID NUMBER CONSTRAINT TEST_6_ID_PK PRIMARY KEY); 外键FOREIGN KEY约束外键将定义一个列或者列的组合作为外键,并建立与同一个表或不同表的主键之间的关系。 被引用、提供主键的表称为父表。参考父表的主键来定义外键的表称为子表。 CONSTRAINT 外键名 FOREIGN KEY (子表的列) REFERENCES 父表名(父表的主键列)); 这种如果子表有对应数据,删除主表的纪录会把子表中对应的记录级联删除。 CONSTRAINT 外键名 FOREIGN KEY (子表的列) REFERENCES 父表名(父表的主键列) ON DELETE CASCADE); 这种如果子表有对应数据,删除主表的纪录会把子表中对应的记录设置为NULL。 CONSTRAINT 外键名 FOREIGN KEY (子表的列) REFERENCES 父表名(父表的主键列) ON DELETE SET NULL); CREATE TABLE TEST_DEPT( ID NUMBER PRIMARY KEY, DEPT_NAME VARCHAR2(50) NOT NULL ); CREATE TABLE TEST_EMP( ID NUMBER PRIMARY KEY, EMP_NAME VARCHAR2(50) NOT NULL, DEPT_ID NUMBER, CONSTRAINT TEST_EMP_DEPT_FK FOREIGN KEY (DEPT_ID) REFERENCES TEST_DEPT(ID));外键的值可以为空,也可以重复。 INSERT INTO TEST_DEPT VALUES (1, 'IT'); INSERT INTO TEST_DEPT VALUES (2, 'EO'); INSERT INTO TEST_EMP VALUES (3, 'winston', NULL); INSERT INTO TEST_EMP VALUES (4, 'GRACE' , 2);父表的主键的记录在子表中已经有对应的记录时,无法删除父表的记录。 父表的主键的记录在子表中没有对应的记录时,可以删除父表的记录。 DELETE FROM TEST_DEPT WHERE ID = 1; TRUNCATE TABLE TEST_DEPT; SQL Error: ORA-02292: integrity constraint (HR.TEST_EMP_DEPT_FK) violated - child record found 创建外键的时候,如果加上ON DELETE CASCADE,子表的数据直接被删除。 CREATE TABLE TEST_EMP1( ID NUMBER PRIMARY KEY, EMP_NAME VARCHAR2(50) CONSTRAINT TEST_EMP1_EMP_NAME_NN NOT NULL, DEPT_ID NUMBER, CONSTRAINT TEST_DEPT_EMP1_DEPT_ID_FK FOREIGN KEY (DEPT_ID) REFERENCES TEST_DEPT(ID) ON DELETE CASCADE); 创建外键的时候,如果加上ON DELETE SET NULL,子表的数据直接被赋值NULL。 CREATE TABLE TEST_EMP1( ID NUMBER PRIMARY KEY, EMP_NAME VARCHAR2(50) CONSTRAINT TEST_EMP1_EMP_NAME_NN NOT NULL, DEPT_ID NUMBER, CONSTRAINT TEST_DEPT_EMP1_ID_FK FOREIGN KEY (DEPT_ID) REFERENCES TEST_DEPT(ID) ON DELETE SET NULL); CHECK约束用于定义每行都必须满足的条件 对一下表达式不允许: 1. 对CURRVAL NEXTBAL LEVEL 和ROWNUM伪列调用不允许。 2. 对SYSDATE UID USER和USERENV函数调用也是不允许。 3. 涉及其他行中的其他值的查询也不允许。 CONSTRAINT 约束名 CHECK (表达式) CREATE TABLE TEST_CHECK1( ID NUMBER, CONSTRAINT TEST_CHECK1_ID_MAX CHECK (ID |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |