09、SQL--约束(1)(2)-(含习题)

本文详细介绍了SQL中的约束,包括NOT NULL、UNIQUE、主键、外键、CHECK约束的定义与应用,以及如何添加、删除和查询约束。通过测验题加深了对外键级联删除和非空、唯一约束的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

约束简介:

 

 

 

 

 

 

一、表级约束和列级约束:

 

 

 

 

 

 

1、NOT  NULL约束:

 

 

 

NOT  NULL约束(constraint):

create table emp2(

id number(10) constraint emp2_id_nn not null,

name varchar2(20) not null,

salary number(10,2)

)

 

2、UNIQUE约束(适用于表级或列级):

 

 

(1)、UNIQUE约束(适用于表级或列级):

create table emp30(

--列级约束

id number(10) constraint emp3_id_uk unique,

name varchar2(20) constraint emp3_name_nn null,

email varchar2(20),

salary number(10,2) ,

--表级约束

constraint emp3_email_uk unique(email)

)

 

 

二、主键:

通过主键可以唯一的定义一个数据表中的一条数据。

 

 

主键也区分列级和表级。

1、列级约束定义主键:

create table empl04(

--列级约束

id number(10) constraint empl04_id_pk primary key,

name varchar2(20) constraint empl04_name_nn null,

email varchar2(20),

salary number(10,2),

--表级约束

constraint empl04_email_uk unique(email)

)

(2)、错误:因为主键一定非空。

SQL> insert into empl04

  2  values(null,'AA',null,2000);
insert into empl04

values(null,'AA',null,2000)

 

ORA-01400: 无法将 NULL 插入 ("SCOTT"."EMPL04"."ID")

正确方式:

insert into empl04

values(1001,'AA',null,2000)

 

(3)、主键违反唯一约束条件:

insert into empl04

values(1001,'CC',null,2000)

ORA-00001: 违反唯一约束条件 (SCOTT.EMPL04_ID_PK)

 

(4)、如果定义一个为主键了,不能将主键对应的属性的值赋为空值或者已经存在的值。

 

 

2、表级约束定义主键:

 

(1)、错误(不允许约束条件说明)

create table empl05(

--列级约束

--id number(10) constraint empl05_id_pk primary key,

id number(10) constraint empl05_id_pk,

name varchar2(20) constraint empl04_name_nn null,

email varchar2(20),

salary number(10,2),

--表级约束

constraint empl05_email_uk unique(email),

constraint empl05_id_pk primary key(id)

)

 

ORA-02253: 此处不允许约束条件说明

订正:

create table empl05(

--列级约束

--id number(10) constraint empl05_id_pk primary key,

id number(10),         //后边的约束条件去掉了。

name varchar2(20) constraint empl04_name_nn null,

email varchar2(20),

salary number(10,2),

--表级约束

constraint empl05_email_uk unique(email),

constraint empl05_id_pk primary key(id)

)

 

三、外键与约束:

 

 

1、外键用于连接

create table empl06(

--列级约束

--id number(10) constraint empl06_id_pk primary key,

id number(10),

name varchar2(20) constraint empl06_name_nn null,

email varchar2(20),

salary number(10,2),

department_id number(10),

--表级约束

constraint empl06_email_uk unique(email),

constraint empl06_id_pk primary key(id),

constraint empl06_dept_id_fk foreign key(department_id)

  约束              约束的名           功能   作用在department_id

references departments(department_id)

与departments表中的department_id做连接。

)

 

2、已经存在1001号id,因为id是主键,所以不允许重复。

insert into empl06

values(1001,'AA',null,2000,2000)

 

ORA-00001: 违反唯一约束条件 (SCOTT.EMPL06_ID_PK)

 

3、未找到父类关键字:在departments表中没有此列。

insert into empl06

values(1002,'AA',null,2000,2000)

ORA-02291: 违反完整约束条件 (SCOTT.EMPL06_DEPT_ID_FK) - 未找到父项关键字

 

4、级联删除、级联置空:

 

在最后书写级联删除或级联置空语句。

(1)、级联置空的书写:

create table empl07(

--列级约束

--id number(10) constraint empl07_id_pk primary key,

id number(10),

name varchar2(20) constraint empl07_name_nn null,

email varchar2(20),

salary number(10,2),

department_id number(10),

--表级约束

constraint empl07_email_uk unique(email),

constraint empl07_id_pk primary key(id),

constraint empl07_dept_id_fk foreign key(department_id) references departments(department_id) on delete set null

)

 

5、CHECK约束:

 

 

(1)、

create table empl08(

--列级约束

--id number(10) constraint empl08_id_pk primary key,

id number(10),

name varchar2(20) constraint empl08_name_nn null,

email varchar2(20),

--加check约束最低生活保障工资不得低于1500,工资不高于30000;

salary number(10,2) check(salary>1500 and salary<30000),

department_id number(10),

--表级约束

constraint empl08_email_uk unique(email),

constraint empl08_id_pk primary key(id),

constraint empl08_dept_id_fk foreign key(department_id) references departments(department_id) on delete set null

)

 

(2)、插入操作:

insert into empl08

values(1001,'AA','AA126@.com',500,30)

 salary必须约束在1500-30000之间

ORA-02290: 违反检查约束条件 (SCOTT.SYS_C0011452)

 

 

四、添加约束:

 

 

1、添加或删除约束:

(1)、修改约束:

alter table empl05

modify(salary number(10,2) not null)

 

(2)、删除约束:

alter table empl05

drop constraint empl05_name_nn

 

(3)、添加约束:

alter table empl05

add constraint empl05_name_uk unique(name)

 

2、无效化约束与解除无效化约束:

 

 

(1)、无效化约束:

alter table empl06

disable constraint empl06_email_uk

 

(2)、使失效的约束有效:

如果属性值存在重复的,解封失效约束的语句会出现有错

为了使解封失效约束的语句可以执行,必须先把重复的属性值删除掉。

alter table empl06

enable constraint empl06_email_uk

 

 

3、查询约束:

 

 

4、查询定义约束的列:

 

 

 

 

五、测验题一:

 

57. 定义非空约束

          1). 非空约束只能定义在列级.

         

          2). 不指定约束名         

 create table emp2 (

          name varchar2(30) not null,

          age number(3)

          );

         

          3). 指定约束名             

  create table emp3(

          name varchar2(30) constraint name_not_null not null,

          age number(3));

           

58. 唯一约束

            1). 列级定义

                    ①. 不指定约束名                   

 create table emp2 (

                    name varchar2(30) unique,

                    age number(3)

                    );

                   

                    ②. 指定约束名                   

create table emp3 (

                    name varchar2(30) constraint name_uq unique,

                    age number(3)

                    );

                   

          2). 表级定义: 必须指定约束名

                    ①. 指定约束名                   

create table emp3 (

                    name varchar2(30),

                    age number(3),

                    constraint name_uq unique(name)

                    );

 

58.1 主键约束:唯一确定一行记录。表明此属性:非空,唯一

                

59. 外键约束

            1). 列级定义

                    ①. 不指定约束名                   

create table emp2(

                           emp_id number(6),

                           name varchar2(25),

                           dept_id number(4) references dept2(dept_id))

                   

                    ②. 指定约束名                   

create table emp3(

                           emp_id number(6),

                           name varchar2(25),

                           dept_id number(4) constraint dept_fk3 references dept2(dept_id))

                   

          2). 表级定义: 必须指定约束名

                    ①. 指定约束名                   

 create table emp4(

                           emp_id number(6),

                           name varchar2(25),

                           dept_id number(4),

                           constraint dept_fk2 foreign key(dept_id) references dept2(dept_id))

           

60. 约束需要注意的地方

 

          1). ** 非空约束(not null)只能定义在列级

 

          2). ** 唯一约束(unique)的列值可以为空

 

          3). ** 外键(foreign key)引用的列起码要有一个唯一约束                

           

61. 建立外键约束时的级联删除问题:

            1). 级联删除:           

 create table emp2(

                 id number(3) primary key,

                 name varchar2(25) unique,

                 dept_id number(3) references dept2(dept_id) on delete cascade)

           

          2). 级联置空           

 create table emp3(

                 id number(3) primary key,

                 name varchar2(25) unique,

                 dept_id number(3) references dept2(dept_id) on delete set null)

 

 

六、测验题二:

 

1、向表emp2的id列中添加PRIMARY KEY约束(my_emp_id_pk)

ALTER table emp2

ADD constraint my_emp_id_pk primary key(id)

为约束起别名(constraint 别名) 将约束作用在id属性中

 

2、向表dept2的id列中添加PRIMARY KEY约束(my_dept_id_pk)

ALTER table dept2

ADD constraint my_dept_id_pk primary key(id)

 

3、向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。

ALTER table emp2

ADD (dept_id number(10)  constraint emp2_dept_id_fk  references dept2(id));

              添加约束                                 为约束起别名                    与dept2中的表相关联

 

准备工作:

          create table emp2 as select employee_id id, last_name name, salary from employees

 

          create table dept2 as select department_id id, department_name dept_name from departments

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值