sql-第05章 确保数据完整性

三葉Leaves Author

1.认识约束

1.1 三种完整性

约束是保证数据库完整性的方法

1.1.1 实体完整性

这个要求主键字段不能为空或者重复的值,保证唯一 通常用 主键约束

1.1.2 区域完整性

保证数据在有效范围内 通常用 检查约束(check)

1.1.3 参照完整性

保证数据库中相关联的表里数据的正确性 通常用 外键约束

1.2 约束类型

1.2.1 主键约束PrimaryKey

保证非空或者唯一的方式,主键可以由多个列组成 多列组合主键示例

1.2.2 外键约束ForeignKey

对相关联的两表使用外键约束后,能保证

  1. 表2要使用外键字段时必须保证其在表一中存在

  2. 表1试图删除主键某字段值时必须保证该数据没被表2使用

    1.2.3 唯一约束Unique

    和主键约束同样是为了保证数据唯一,区别如下

  3. 表中可以设置多个唯一约束,但仅一个主键约束

  4. 唯一约束允许空值

    1.2.4 检查约束Check

    保证数量在范围内

    1.2.5 非空约束Not Null

    顾名思义

2. 使用约束

2.1 约束语法

imagepng
imagepng
imagepng
imagepng
这难崩的约束语法属实给我干沉默了,可读性太差 和GPT聊了聊,终于是把 CONSTRAINT 子句搞明白了: CONSTRAINT 子句示例

定义约束的时候,要是表中存在与约束相悖的数据,那么定义语句将报错

2.2 实操创建主键与删除主键

使用如下语句

  • 在创建表的同时创建主键

  • 为city设置默认值“厦门”(用户键入数据时候若没有提供city值,会自动取值厦门)

    1
    create table customer(

        cno char(15) PRIMARY KEY,

        cname varchar(30),

        city VARCHAR(30) DEFAULT ‘厦门’,

        manager varchar(10),

        tel  char(20));

1
2
3
4
5
6
7
删除刚才创建的主键
``` sql
ALTER TABLE

customer

DROP CONSTRAINT PK__customer_cno

刚才的操作并没有指定主键名称,所以我是在SMSS图形化界面中修改得到了主键名称为 PK__customer_cno (默认名称里不知为何有难崩的一串乱码,而且PK后面的下划线还是两个),才能完成删除操作

为了优雅地脱离图形化界面完成这个操作,我试图用T-SQL查阅主键名称,代码如下

1
2
3
4
5
6
7
SELECT name

FROM sys.key_constraints

WHERE parent_object_id = OBJECT_ID('customer')

AND type = 'PK';

这个后面跟着一个看不懂但也无关紧要的查询条件 罢了,我干脆在创建表的时候就把主键名称指定好得了

1
2
3
4
5
6
7
8
9
10
CREATE TABLE customer (

cno CHAR(15),
cname VARCHAR(30),
city VARCHAR(30),
manager VARCHAR(10),
tel CHAR(20),

CONSTRAINT pk_customer_cno PRIMARY KEY (cno)
);

修改刚开始创建表的语句,使其在创建表和主键的同时指定了主键名称为 pk_customer_cno

在后来的学习中发现,其实在SQL sever中有通过存储过程轻松查询各种约束详细信息的方法

查询表中所有约束的详细信息

1
sp_helpconstraint 表名

执行后能得到如下图的信息

imagepng
imagepng
可以说是一目了然

2.3 实操探究外键关系

创建表的同时添加外键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE customer (
cno CHAR(15) PRIMARY KEY,
cname VARCHAR(30),
city VARCHAR(30),
manager VARCHAR(10),
tel CHAR(20)
);

CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id CHAR(15),
order_date DATE,
CONSTRAINT fk_customer_id FOREIGN KEY (customer_id)
REFERENCES customer (cno)
ON DELETE CASCADE
ON UPDATE CASCADE
);

关键字 REFERENCES 后面要列出主表(本例中主表为customer)从表则是orders. ON DELETE CASCADEON UPDATE CASCADE 分别应用了删除级联关系和更新级联关系

不使用级联的情况

  • 试图在主表中删除主表和从表关联共有的数据,SMSS会报错;

  • 试图在从表中删除主表和从表关联共有的数据,删除成功,查询从表,发现数据确实被删除,而主表中相关数据却还在

    使用级联情况下

  • 试图向从表中添加主表外键不存在的字段值,报错(该从表同时关联了两个主表,添加数据时一个字段值在主表1中存在,另一个则在主表2中不存在) 得出不能添加任意一个主表中不存在的数据

  • 试图在从表中删除与主表有关联的数据,删除成功,验证发现从表数据确实没了,主表还在

  • 试图在主表中删除与从表有关联的数据,删除成功,验证发现主表和从表数据都没了

    结论

    在创建外键约束时候用到 REFERRNCES 关键字,测试的结果也充分说明了什么是参考,这个词用得确实很精妙了

  • 标题: sql-第05章 确保数据完整性
  • 作者: 三葉Leaves
  • 创建于 : 2024-05-26 00:00:00
  • 更新于 : 2024-11-21 16:56:20
  • 链接: https://leavesblog.netlify.app/44fcfb8ca46c/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论