SQL的五大约束

SQL的五大约束当我们在创建数据库的表和字段时 我们总是说要声明约束 那约束究竟是什么呢 那么又如何在创建表时或者已经创建好了表之后通过添加删除来怎样进行约束呢 听我来说说吧 前言 分为了五个部分 NOT NULL 指定某列不能存储 NULL 未知

大家好,我是讯享网,很高兴认识大家。

当我们在创建数据库的表和字段时,我们总是说要声明约束,那约束究竟是什么呢?那么又如何在创建表时或者已经创建好了表之后通过添加删除来怎样进行约束呢?听我来说说吧!

【前言】

分为了五个部分:

  • NOT NULL:指定某列不能存储NULL(未知,但不是空)值,强制要求字段必须要包含值
  • UNIQUE:唯一约束,防止一个特定的列中两个记录有一致的值
  • CHECK:检查约束,保证列中的值符合指定的条件。用于限制列中的值的范围
  • PRIMARY KEY:主键约束,确保某列必须要有唯一标识符
  • FOREIGN KEY:外键约束,主键和外键创建了不同表中数据的相互关系

分为了两种情况:

在创建表时规定(CREATE TABLE table_name)

在创建表之后规定(ALTER TABLE table_name)

【正文】

一、NOT NULL

在默认情况下,表接受NULL 值

约束强制列不接受NULL 值

<举例>

CREATE TABLE table_name语句

现要创建一个学生信息表,对表中的列进行约束

CREATE TABLE Student ( SId int NOT NULL, SAge int NOT NULL );

讯享网

ALTER TABLE table_name语句

添加NOT NULL约束

讯享网ALTER TABLE Student ADD COLUMN Student int NOT NULL; 在一个创建好的学生信息表中添加NOT NULL约束 

二、UNIQUE

唯一约束

防止一个特定的列中两个记录有一致的值

<举例>

CREATE TABLE table_name语句

现要创建一个学生信息表,对SName列进行UNIQUE约束

CREATE TABLE Student ( SId int, SName varchar(50) SAge int UNIQUE );

当要对多个列进行约束时:对SId列和SName列进行UNIQUE约束

讯享网CREATE TABLE Student ( SId int, SName varchar(50) SAge int UNIQUE, CONSTRAINT uc_PersonId UNIQUE (SId, SName) );

ALTER TABLE table_name语句

添加UNIQUE约束:

ALTER TABLE Student ADD UNIQUE (SId) 对SId列添加UNIQUE约束 

讯享网ALTER TABLE Student ADD CONSTRAINT uc_PersonID UNIQUE (SId, SName) 当要对多个列进行约束时:对SId列和SName列进行UNIQUE约束

删除UNIQUE约束:

ALTER TABLE Student DROP CONSTRATIN uc_PersonId

注:在对ALTER TABLE table_name语句进行UNIQUE约束时,会发现多了一个uc_PersonId,这个是什么呢?

uc_PersonId是一个联合约束名,就是UNIQUE CONSTRAINT的缩写(意思是唯一约束),就是对表中的SId列和SName列进行强制约束。

三、CHECK

检查约束

保证列中的值符合指定的条件

用于限制列中的值的范围

<举例>

CREATE TABLE table_name语句

现要建一个学生信息表,对表中的SAge列进行范围约束

讯享网CREATE TABLE Student ( SId int NOT NULL, SName varchar(50) NOT NULL, SAge int CHECK(SAge >= 0) ); 

从语句中我们可以看出,对SAge这个列进行了一个CHECK约束,强制要求它的范围必须大于等于0,按照常识,我们的年龄不可能比0还小,当它超出了所约束的范围时,系统就会报错

当要对多个列进行约束时:对SId列和SName列进行CHECK约束


讯享网

CREATE TABLE Student ( SId int NOT NULL, SName varchar(50), SAge int NOT NULL, CONSTRAINT chk_PersonId (SId >0 AND SAge >=0)

ALTER TABLE table_name语句

添加约束:

讯享网ALTER TABLE Student ADD CHECK (SId>0)
ALTER TABLE Student ADD CONSTRAINT chk_PersonId CHECK (SId >0 AND SAge >=0) 对多行表进行约束 对已创建好的Student表中的SId列和SAge列进行约束

删除约束:

讯享网ALTER TABLE Student DROP CONSTRAINT chk_PersonId

四、PRIMARY KEY

主键约束

在所有约束中,最重要的,也最常用。要向符合第一范式,则每个表中都必须有一个主键(提供表之间的链接)

是UNIQUE约束和NOT NULL约束的组合

确保某列必须要有唯一标识符

主键约束不可重复,不可NULL值

<举例>

CREATE TABLE table_name 语句

现要创建一个学生信息表,对SId列进行主键PRIMARY KEY约束

CREATE TABLE Student ( SId int NOT NULL PRIMARY KEY, SName varchar(50) NOT NULL, SAge int NOT NULL );

ALTER TABLE table_name语句

添加约束

讯享网ALTER TABLE Student ADD PRIMARY KEY (SId) 对SId列进行PRIMARY KEY约束
ALTER TABLE Student ADD CONSTRAINT uc_PersonId PRIMARY KEY (SId, SName) 对SId列和SName列进行联合主键约束

删除PRIMARY KEY约束

讯享网ALTER TABLE Student DROP CONSTRAINT uc_PersonId 

到这里我们就会有一个疑问了,明明一个表中只能有一个字段为主键,为什么这里还要联合多列为主键呢?其实我当时也有过这样的疑惑。请点击:mysql的联合主键与复合主键区别 - 简书

当我们约束PRIMARY KEY时,还需要特别注意一点:当对某列或者多个列进行PRIMARY KEY约束时,一定要保证你所约束的字段是NOT NULL的,如果不是,系统就会报错,无法进行约束。电脑前的小伙伴可以试试:当你所约束的字段不是NOT NULL时会时什么样的,自己动动手指试试吧!我当时就上了这个当,你们一定要谨记哈

五、FOREIGN KEY

外键约束

主键和外键创建了不同表中数据的相互关系

可能对这段抽象的文字有点疑惑。我来举个例子来看看吧

现有分别有两张学生信息表和学生所喜爱的电影信息表

Student
SIde SAge SName
1 17 春花
2 19 夏雪
3 15 秋月

Films
FilmId Rating SId
1 2 1
2 4 3
3 1 2

从图中我们会发现:Student表中的SId列是Student表的PRIMARY KEY

                                 Films表中的SIde列是Films表中的FOREIGN KEY

                                 Student表中的SId列指向了Films表中的SId

 Student表和Films表中的主键和外键使两个表创建了连接关系

举例

CREATE TABLE table_name语句

现有一个Student表,创建一个Films表,对SIde列进行外键约束

CREATE TABLE Films ( FilmId int NOT NULL PRIMARY KEY, Rating int NOT NULL, SId int FOREIGN KEY REFERENCES Student(SId) );

前提:必须有另一个已经建好的要联系的表

ALTER TABLE table_name语句

添加主键

讯享网ALTER TABLE Films ADD CONSTRAINT fk_StuFils FOREIGN KEY (SId) REFERENCES Student (SId)

删除主键

ALTER TABLE Films DROP CONSTRAINT fk_StuFils

【总结】

我们再实际业务场景中在选择约束时,需要根据具体的业务需求和数据规则进行考虑。考虑约束的性能影响,过多或复杂的约束可能会影响数据库的性能。因此,在选择约束时需要权衡数据完整性和性能之间的平衡

小讯
上一篇 2025-03-25 21:05
下一篇 2025-03-04 16:28

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/29820.html