SQL进阶

一、约束

1、非空约束

1.1约束

在 SQL 中,约束是规定表中的数据规则。若存在违反约束的行为,行为就会被阻止。它能帮助管理员更好地管理数据库,并且确保数据库中数据的正确性和有效性。例如在后台的数据库设计中对要输入的数据进行核查或判断,再决定是否写入数据库,这都是约束的应用。

1.2 NOT NULL

NOT NULL 约束强制列不接受 NULL 值,强制字段始终包含值,这意味着,如果不向字段添加值,就无法插入新纪录或者更新记录。

例子:

先创建一个表 SQL 强制 ID 列、 LastName 列以及 FirstName 列不接受 NULL 值:

create table Person
( 
    ID int not null,
    LastName varchar(50) not null,
    FirstName varchar(50) not null,
    Age int
);

示例代码:

在一个已创建的表的 Age 字段中添加 NOT NULL 约束如下所示:

alter table Person
modify Age int not null;

在一个已创建的表的 Age 字段中删除 NOT NULL 约束如下所示:

alter table Person
modify Age int null;
注意:

不要把 NULL 值与空串相混淆。NULL 值是没有值,

它不是空串。如果指定' '(两个单引号,其间没有字符),这
在 NOT NULL 列中是允许的。空串是一个有效的值,它不是无
值。NULL 值用关键字 NULL 而不是空串指定。

2、唯一约束

在前面的学习中我们知道了 NOT NULL 约束是强制列不接受 NULL 值,在有些情况下,我们不希望一个表中出现重复的记录,这时候我们需要用到 UNIQUE 约束来解决这些问题。

        UNIQUE 约束唯一标识数据库表中的每条记录;

        UNIQUE 和主键约束均为列或列集合提供了唯一性的保证;

        主键约束会自动定义一个 UNIQUE 约束,或者说主键约束是一种特殊的 UNIQUE 约束。但是二者有明显的区别:每个表可以有多个 UNIQUE 约束,但只能有一个主键约束。

2.1 CREATE TABLE 时的 UNIQUE 约束

SQL 在 Persons 表创建时在 P_Id 列上创建 UNIQUE 约束:

CREATE TABLE Persons
(
    P_Id int NOT NULL UNIQUE,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
)

命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束:

CREATE TABLE Persons
(
    P_Id int NOT NULL UNIQUE,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    constraint uc_PersonID unique(P_Id,LastName)
)
2.2 ALTER TABLE 时的 UNIQUE 约束

当表已被创建时,在 P_Id 列创建 UNIQUE 约束:

alter table Person
add unique(P_Id);

当表已被创建时,需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束:

alter table Person
add constraint uc_PersonID unique (P_Id,LastName);
2.3 撤销唯一约束unique
alter table Person
drop constraint uc_PersonID;

3、主键约束PRIMARY KEY

3.1 主键约束

PRIMARY KEY 约束唯一标识数据库表中的每条记录 ,简单的说,PRIMARY KEY = UNIQUE + NOT NULL ,从技术的角度来看,PRIMARY KEY 和 UNIQUE 有很多相似之处。但还是有以下区别:

        NOT NULL UNIQUE 可以将表的一列或多列定义为唯一性属性,而 PRIMARY KEY 设为多列时,仅能保证多列之和是唯一的,具体到某一列可能会重复。

        PRIMARY KEY 可以与外键配合,从而形成主从表的关系,而 NOT NULL UNIQUE 则做不到这一点。

如:

表一:用户 id (主键),用户名

表二: 银行卡号 id (主键),用户 id (外键)

则表一为主表,表二为从表。

        更大的区别在逻辑设计上。 PRIMARY KEY 一般在逻辑设计中用作记录标识,这也是设置 PRIMARY KEY 的本来用意,而 UNIQUE 只是为了保证域/域组的唯一性。

3.2 create table 时添加 primary key 约束

前面我们创建了个人信息数据表 Persons,我们希望每个人的标识符 P_Id 都是唯一的。
下面的 SQL 在 个人信息表 Persons 创建时,在 P_Id 列上添加 PRIMARY KEY 约束:

CREATE TABLE Persons
(
    P_Id int NOT NULL primary key,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
)

上述语句中 NOT NULL 为非空约束,即输入值必须不为空否则会报错。

如需命名并定义多个列的 PRIMARY KEY 约束,语法:

CREATE TABLE Persons
(
    P_Id int NOT NULL primary key,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    constraint uc_PersonID primary key(P_Id,LastName)
)

注释:
在上面的实例中,只有一个主键 PRIMARY KEY(pk_PersonID)。然而,pk_PersonID 的值是由两个列(P_Id 和 LastName)组成的。

执行输出结果:

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| P_Id      | int(11)      | NO   | PRI | NULL    |       |
| LastName  | varchar(255) | NO   |     | NULL    |       |
| FirstName | varchar(255) | YES  |     | NULL    |       |
| Address   | varchar(255) | YES  |     | NULL    |       |
| City      | varchar(255) | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
 3.3 ALTER TABLE 时添加主键约束

如果我们在创建 Persons 时没有指定创建主键约束,此时是否需要删除表再重新写带有主键约束的建表语句呢?这里我们可以使用 ALTER TABLE 语句在创建表后添加主键约束。

当表已被创建时,如需在 P_Id 列创建 PRIMARY KEY 约束:

alter table Person
add primary key (P_Id);

执行输出结果:

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| P_Id      | int(11)      | NO   | PRI | NULL    |       |
| LastName  | varchar(255) | NO   |     | NULL    |       |
| FirstName | varchar(255) | YES  |     | NULL    |       |
| Address   | varchar(255) | YES  |     | NULL    |       |
| City      | varchar(255) | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

如需命名并定义多个列的 PRIMARY KEY 约束,可以使用下面的 SQL 语法:

alter table Person
add constrain pk_PersonID primary key('P_Id','LastName');

注释:

如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。

执行输出结果:

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| P_Id      | int(11)      | NO   | PRI | NULL    |       |
| LastName  | varchar(255) | NO   | PRI | NULL    |       |
| FirstName | varchar(255) | YES  |     | NULL    |       |
| Address   | varchar(255) | YES  |     | NULL    |       |
| City      | varchar(255) | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

4、外键约束 FOREIGN KEY

一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY 。

4.1 外键的作用

外键最根本的作用:保证数据的完整性和一致性。

就这么说吧,学生表和院系表,这里的院系就是学生表的外键,外键表是学生表,主键表是院系表。现在,院系表中的某个院系被你删除了,而你又想在学生表中要想查询这个被删除的院系号所对应的院信息,但是执行之后报错了。

为什么?

因为学生表当中的院系是外键,是联接着院系表当中的院系,而且,院系表当中的院系还是它本身这个表的主键,这两个表的数据信息是连着的,你删除其中一个表中的外键,另一个表中的主键都没有删除,查询执行之后当然会报错啦。学生表中已经不存在这个系了,所以,删除院系表(主键表)时必须删除其他与之关联的表。

这就是外键的作用,外键可以保持数据的一致性、完整性。

4.2 外键约束

外键约束是指用于在两个表之间建立关系,需要指定引用主表的哪一列。

4.2.1 create table 时的foreign key 约束

在 "Orders" 表创建时在 "P_Id" 列上创建 FOREIGN KEY 约束:

create table Orders
(
    O_Id int not null,
    OrderNo int not null,
    P_Id int,
    primary key(O_Id),
    foreign key(P_Id) references Persons(P_Id)
);

 其中

NOT NULL 表示该字段不为空
REFERENCES 表示 引用一个表

 如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束:

create table Order
(
    O_Id int not null,
    OrderNo int not null,
    P_Id int,
    primary key(O_Id),
    constraint fk_PerOrders foreign key (P_Id)
    references Persons(P_Id)
);

 其中

CONSTRAINT 表示约束,后面接约束名称,常用于创建约束和删除约束;

4.2.2 alter table 时的foreign key 约束

当 "Orders" 表已被创建时,如需在 "P_Id" 列创建 FOREIGN KEY 约束:

alter table Orders
add foreign key (P_Id)
references Persons(P_Id)

如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束:

alter table Orders
add constraint fk_PerOrders
foreign key(P_Id)
references Persons(P_Id)
4.2.3 撤销foreign key 约束

删除 FOREIGN KEY 约束:

alter table Order 
drop foreign key;--MySQL
drop constraint key fk_PerOrders;--SQL Sever

你可能感兴趣的:(数据库系统概念进阶,sql,数据库,mysql)