SQL

SQL 知识量:22 - 44 - 129

22.1 约束><

约束- 22.1.1 -

约束就是用于管理如何插入或处理数据库数据的规则。

DBMS通过在数据库表上施加约束来实施引用完整性,大多数的约束是在表定义中定义的,例如主键、外键、唯一约束、检查约束等。

由数据库完成约束管理而不是由客户端或人为管理是十分必要的,主要原因是:

  • 如果在客户端层面进行数据库约束管理,那么每个客户端都要被迫实施这些规则和动作,但一定会有客户端忘记或不实施这些规则。

  • 进行任何操作,包括在执行update和delete操作时,也要实施约束管理,这对于客户端来说太繁琐,会消耗掉大量的资源。

  • 执行客户端检查是非常耗时的,而DBMS执行这些检查会相对高效。

主键- 22.1.2 -

主键是一种特殊的约束,用来保证一列(或一组列)中的值是唯一的,而且永远不改动。这方便了直接或交互的处理表中的行,没有主键,要安全的更新或删除特定行而不影响其他行会非常困难。

表中的任何列只有满足以下条件,都可以用于主键:

  • 任意两行的主键值都不相同。

  • 每行都有一个主键值,即不允许有null值。

  • 包含主键值的列从不修改或更新。

  • 主键值不能重用。如果从表中删除了一行,改行的主键值不能再分配给新行。

定义主键的方法主要有两种,一种是在定义表时创建它,另一种是在修改表时创建它。

例如:新建表man,创建(组合)主键id,name。

create table man(
    id int(11) not null auto_increment,
    name varchar(255) not null,
    age int(11) null,
    sex varchar(255) null,
    primary key (id,name)
);

以上示例中,如果是单个列为主键,也可以在列定义中设置主键。

create table man(
    id int(11) not null primary key auto_increment,
    name varchar(255) not null,
    age int(11) null,
    sex varchar(255) null
);

例如:修改表woman,添加主键id。

alter table woman add primary key (id);

外键- 22.1.3 -

外键是表中的一列,其值必须在另一个表的主键中。外键是保证引用完整性的极其重要的部分。

与主键一样,定义外键的方法主要有两种,一种是在定义表时创建它,另一种是在修改表时创建它。

例如:创建一个考试表exam,其中id_course列与选课表course的主键id关联,即:id_course是考试表exam的外键。

create table exam(
    id int not null primary key auto_increment,
    id_course int not null,
    score int not null,
    foreign key(id_course) references course(id)
);

如果考试表在定义时没有定义外键,现在通过修改语句添加外键,SQL语句为:

alter table exam add foreign key(id_course) references course(id);

唯一约束- 22.1.4 -

唯一约束用于保证一列(或一组列)中的数据是唯一的。类似于主键,但是存在以下区别:

  • 表可以包含多个唯一约束,但主键只能有一个。

  • 唯一约束可以包含null值。

  • 唯一约束可以修改或更新。

  • 唯一约束列的值可以重复使用。

  • 唯一约束不能用于定义外键。

在具体应用中,许多需要确保唯一性的信息都可以使用唯一约束,例如身份证号码、社会信用代码等等。

检查约束- 22.1.5 -

检查约束用于保证一列(或一组列)中的数据满足一组指定的条件。其常见的用途包括:

  • 检查最小值或最大值。

  • 指定值的范围。

  • 规定只允许特定的值。

检查约束将在数据类型限制的基础上,进一步限制数值的范围,确保插入数据库中的数据是真正合法的(想要的)数据。

注意:并非所有的DBMS都支持检查约束,MySQL目前还不支持,但是Oracle支持。

例如:建立people表,规定年龄必须大于0。

create table people(
       id int not null primary key auto_increment,
       name varchar(255) not null,
       age int not null check(age>0),
       sex varchar(255) not null
);

还可以使用添加的方式设置检查约束,以上对年龄的约束修改为:

add constraint check(age>0);