SQL之约束

约束

约束条件包括:
非空约束(Not Null),简称NN
唯一性约束(Unique),简称UK
主键约束(Primary Key),简称PK
外键约束(Foreign Key),简称FK
检查约束(Check),简称CK

非空约束

非空约束用于确保字段值不为空。默认情况下,任何列都允许有空值,但业务逻辑可能会要求某些列不能取空值。当某个字段被设置了非空约束条件,这个字段中必须存在有效值,即:
*当执行INSERT操作时,必须提供这个列的数据
*当执行UPDATE操作时,不能给这个列的值设置为NULL

建表时添加非空约束

CREATE TABLE employees_swm(
    eid NUMBER(6),
    name VARCHAR2(30) NOT NULL,
    salary NUMBER(7,2),
    HIREDATE DATE CONSTRAINT employees_hiredate_nn_swm NOT NULL
)
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

修改表时添加非空约束

可以在建表之后,通过修改表的定义,添加非空约束

ALTER TABLE employees_swm
MODIFY (eid NUMBER(6) NOT NULL)
  
  
  • 1
  • 2

唯一性约束

唯一性(Unique)约束条件用于保证字段或者字段的组合不出现重复值。当给表的某个列定义了唯一约束条件,该列的值不允许重复,但允许是NULL值。
唯一性约束条件可以在建表同时建立,也可以在建表以后再建立。

添加唯一性约束

在建表employees的同时,在eid、email列上创建唯一约束条件,并在建表后在name列上建立一个名为employees_name_uk的唯一约束条件:

CREATE TABLE employees1_swm(
    eid NUMBER(6) UNIQUE,
    name VARCHAR2(30),
    email VARCHAR2(50),
    salary NUMBER(7, 2),
    hiredate DATE,
    CONSTRAINT employees_email_uk_swm UNIQUE(email)
)
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在建表之后增加唯一性约束条件:

ALTER TABLE employees1_swm
ADD CONSTRAINT employees_name_uk UNIQUE(name);
  
  
  • 1
  • 2
INSERT INTO employees1_swm
    (eid,name,email)
VALUES
    (1,'JACK','JACK@QQ.COM')
  
  
  • 1
  • 2
  • 3
  • 4

主键约束

主键(Primary Key)约束条件从功能上看相当于非空(NOT NULL)且唯一(UNIQUE)的组合。
主键字段可以是单字段或多字段组合,即:在主键约束下的单字段或者多字段组合上不允许有空值,也不允许有重复值。
主键可以用来在表中唯一的确定一行数据。一个表上只允许建立一个主键,而其它约束条件则没有明确的个数限制。

主键选取的原则

主键应是对系统无意义的数据
永远也不要更新主键,让主键除了唯一标识一行之外,再无其他的用途
主键不应包含动态变化的数据,如时间戳
主键应自动生成,不要人为干预,以免使它带有除了唯一标识一行以外的意义
主键尽量建立在单列上

添加主键约束条件

在建表时添加主键约束条件
CREATE TABLE employees2_swm(
    eid NUMBER(6) PRIMARY KEY,
    name VARCHAR2(30),
    email VARCHAR2(50),
    salary NUMBER(7,2),
    hiredate DATE
)
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
建表后创建主键约束条件,并自定义约束条件名称
ALTER TABLE employees2_swm
ADD CONSTRAINT employees2_swm_eid_pk PRIMARY KEY (eid);
  
  
  • 1
  • 2

外键约束(几乎不用)

外键约束的意义
外键约束条件定义在两个表的字段或一个表的两个字段上,用于保证相关两个字段的关系。比如emp表的deptno列参照dept表的deptno列,则dept称作主表或父表,emp表称作从表或子表。

添加外键约束

建表时添加外键约束条件
CREATE TABLE employees4 (
eid NUMBER(6),
name VARCHAR2(30),
salary NUMBER(7, 2),
deptno NUMBER(4)
);
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
在建表后建立外键约束条件
ALTER TABLE employees4
ADD CONSTRAINT employees4_deptno_fk 
FOREIGN KEY (deptno) REFERENCES dept(deptno);
  
  
  • 1
  • 2
  • 3

外键约束对一致性的维护

外键约束条件包括两个方面的数据约束:
从表上定义的外键的列值,必须从主表被参照的列值中选取,或者为NULL;
当主表参照列的值被从表参照时,主表的该行记录不允许被删除。

--成功DML语句:
INSERT INTO employees4(eid, name, deptno) 
    VALUES(1234, ‘rose tyler’, 40);--成功
INSERT INTO employees4(eid, name, deptno) 
    VALUES(1235, ‘martha jones’, NULL); --成功
--失败DML语句:
INSERT INTO   employees4(eid, name, deptno) 
    VALUES(1236, 'donna noble', 50);
    --失败,不存在部门50
DELETE FROM dept WHERE deptno  = 40;
    --失败,40被参照,不允许删除
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

外键约束对性能的降低

如果在一个频繁DML操作的表上建立外键,每次DML操作,都将导致数据库自动对外键所关联的对应表做检查,产生开销,如果已在程序中控制逻辑,这些判断将增加额外负担,可以省去。
另外外键确定了主从表的先后生成关系,有时会影响业务逻辑。

关联不一定需要外键约束

如果业务逻辑要求保证数据完整性,可由程序或触发器控制,不一定需要外键约束。
另外为了简化开发,维护数据时不用考虑外键约束,以及大量数据DML操作时不需考虑外键耗费时间。

检查约束

检查(Check)约束条件用来强制在字段上的每个值都要满足Check中定义的条件。当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件。

添加检查约束

员工的薪水必须大于2000元,增加检查约束:

ALTER TABLE employees2_swm
ADD CONSTRAINT employees2_swm_salary_check
CHECK (salary > 2000);
  
  
  • 1
  • 2
  • 3

当插入大于2000的数据,操作成功:

INSERT INTO employees2_swm
    (eid,name,salary,deptno)
VALUES
    (1234,'donna noble',2400,40)
  
  
  • 1
  • 2
  • 3
  • 4

试图修改职员的薪水为1500元,更新失败:

UPDATE employees2_swm
SET salary=1500
WHERE eid=1234
  
  
  • 1
  • 2
  • 3

转自IsSwm的博客:https://blog.csdn.net/qq_27853161/article/details/53608699

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值