一、问题引入

在复习关系型数据库过程中,对于数据库的完整性约束总是一知半解。而且数据库的约束是关系型数据库的重点内容,课本翻过来翻过去好像看懂了,但是通过书面语描述出来又有点困难。

这里借助博客的方式,书面描述数据的约束以及具体操作

二、解决过程

关系型数据约束有六种:主键约束、外键约束、唯一约束、默认值约束、检查约束、非空(NOT NULL)约束

2-1 主键约束(PRIMARY KEY)

主键是一种特殊的约束,它用来保证一个列(或一组列)中的值是唯一的,并且永不改动。

💡 没有主键,要安全地 update 或 delete 特定的行而不影响其他行会非常困难

create table 表名

(

_id int not null primary key,

name char(10)

)

-- 或者

create table 表名

(

_id int not null,

name char(10),

primary key(_id)

)

-- 或者

alter table 表名

add constraint primary key (_id);

2-2 外键约束(FOREIGN KEY)

外键是表中的一个列,其值必须在另一个表的主键列出。

外键是保证引用完整性的一个重要成分,表与表之间的关系就是通过外键体现的。

💡 外键可帮助防止意外的删除

create table 表名1

(

_id int not null primary key,

_name char(10) not null references 表名2(_name)

)

-- 或者

alter table 表名1

add constraint

foreign key (_name) references 表名2 (_name)

2-3 唯一约束

唯一约束用来保证一个列(或一组列)中的数据唯一。唯一约束和主键约束很像,但是有区别:

create table 表名

(

_id int not null primary key,

id_card char(18) unique

)

-- 或者

alter table 表名

add constraint 约束名称

unique (列名)

2-4 检查约束

检查约束用来保证一个列(或一组列)中的数据满足一组指定的条件。

条件:

检查最小或最大值

指定范围

只允许特定的值

create table 表名

(

_id int not null primary key,

quantity int not null check(quantity > 0)

sex char(1) not null check(sex like '[MF]')

)

2-5 默认值约束

默认值约束可以在插入数据时,若不给定列的值,表会按照预先规定给与默认的值。

例如:希望自动获取系统时间,无需用户提供;自动获取自增主键的值,无需用户提供

create table 表名

(

oid UNIQUEIDENTIFIER DEFAULT NEWID(),

timestamp datetime2(0) DEFAULT GETDATE()

)

2-6 非空约束

非空约束可以避免列值为null的情形,列为null会增加表的存储空间。

默认情况下,如果未指定NOT NULL约束,SQL Server将允许列接受NULL。默认为可空

三、反思总结

通过博客文字描述,再一次加深了对完整性约束的定义以及具体操作,完整性约束属于数据库的基础性知识。

在具体业务中,设计表的结构时,就需要在数据库服务器上利用约束来限制用户的非法操作,而不是在客户端检查约束。在数据库服务器上作约束,开发客户端程序会简单很多。

四、参考引用

01-史上最全的 MSSQL 复习笔记

02-SQL必知必会(第3版)