数据库中的各种约束

概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。

分类:

1. 非空约束:not null
2. 唯一约束:unique
3. 主键约束:primary key
4. 外键约束:foreign key
5. 检查:check

虽然约束的作用只是用于保证数据表里数据的完整性,但约束也是数据库对象,并被存储在系统表中,也拥有自己的名字。根据约束对数据列的限制,约束分为如下两类:

  • 单列约束:每个约束只约束一列。
  • 多列约束:每个约束可以约束多个数据列。

为数据表指定约束有如下两个时机:

  • 建表的同时为相应的数据列指定约束。
  • 建表后创建,以修改表的方式来增加约束。

大部分约束都可以采用列级约束语法或者表级约束语法。下面依次介绍5种约束的建立和删除(约束通常无法修改)。

非空约束:not null

SQL中的null不区分大小写,所有数据类型的值都可以是null,包括int、float、boolean等数据类型,空字符串不等于null,0也不等于null,并且null不等于null,所以在唯一约束里允许多个null值。

1. 创建表时添加约束
	CREATE TABLE stu(
		id INT,
		NAME VARCHAR(20) NOT NULL -- name为非空
	);
2. 创建表完后,添加非空约束
	ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

3. 删除name的非空约束
	ALTER TABLE stu MODIFY NAME VARCHAR(20);

唯一约束:unique

同一个表内可建多个唯一约束,唯一约束也可由多列组合而成。当为某列创建唯一约束时,MySQL会为该列相应地创建唯一索引。如果不给唯一约束起名,该唯一约束默认与列名相同

1. 创建表时,添加唯一约束
	CREATE TABLE stu(
		id INT UNIQUE,             -- 1.列级约束语法
        UNIQUE(id),                -- 2.表级约束语法 
        CONSTRSINT 别名 UNIQUE(id)  -- 3.表级约束语法起别名
	);
    * 注意mysql中,唯一约束限定的列的值可以有多个null,创建组合约束
	* 只能用表级约束法。这里只是为了阐述问题方便放在了同一个表中,
	* 实际只选择其中一种即可,以下的也是如此。

2. 删除唯一约束
	ALTER TABLE stu DROP INDEX phone_number;

3. 在创建表后,添加唯一约束
	ALTER TABLE stu MODIFY id INT UNIQUE;     -- 1.添加单列约束
    ALTER TABLE stu ADD UNIQUE(列名1,列名2);   -- 2.添加组合约束

主键约束:primary key

主键约束相当于非空约束和唯一约束,即主键约束的列既不允许出现重复值,也不允许出现null值;如果对多列组合建立主键约束,则多列里包含的每一列都不能为空,但只要求这些列组合不能重复。主键列的值可用于唯一地标识表中的一条记录。

1. 注意:
	1. 含义:非空且唯一
	2. 一张表只能有一个字段为主键
	3. 主键就是表中记录的唯一标识

2. 在创建表时,添加主键约束
	CREATE TABLE stu(
		id INT PRIMARY KEY,                  -- 1.列级主键约束语法
		name VARCHAR(20),
        PRIMARY KEY(id),                     -- 2.表级主键约束语法
        PRIMARY KEY(id,name),                -- 3.表级组合主键约束语法
        CONSTRSINT 别名 PRIMARY KEY(id,name)  -- 4.表级组合主键约束语法 
	);

* 如果需要对多个字段建立组合主键约束,则只能使用表级约束语法

3. 删除主键
	-- 错误 ALTER TABLE stu MODIFY id INT ;
	ALTER TABLE stu DROP PRIMARY KEY;

4. 创建完表后,添加主键
	ALTER TABLE stu MODIFY id INT PRIMARY KEY; -- 1.列级语法添加单列主键约束 
    ALTER TABLE stu ADD PRIMARY KEY(id,name); -- 2.表级语法添加组合主键约束

5. 自动增长:
	1.  概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长

	2. 在创建表时,添加主键约束,并且完成主键自增长
	CREATE TABLE stu(
		id INT PRIMARY KEY AUTO_INCREMNET,
		name VARCHAR(20)
	);
	
	3. 删除自动增长
	ALTER TABLE stu MODIFY id INT;

	4. 添加自动增长
	ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

外键约束:foreign key

外键约束通常用于定义两个实体之间的一对多、一对一的关联关系。对于一对多的关联关系,通常在多的一端增加外键列。

当主表的记录被从表记录参照时,主表记录不允许被删除,必须先把从表里参照该记录的所有记录全部删除后,才可以删除主表的该记录。还有一种方式,删除主表记录时级联删除从表中所有参照该记录的从表记录。

从表外键参照的只能是主表主键列或者唯一键列,这样才可保证从表记录可以准确定位到被参照的主表记录。同一个表内可以拥有多个外键。

建立外键约束同样可以采用列级约束语法和表级约束语法。如果仅对单独的数据列建立外键约束,则使用列级约束语法即可;如果需要对多列组合创建外键约束,或者需要为外键约束指定名字,则必须使用表级约束语法,值得指出的是,虽然MySQL支持使用列级约束语法来建立外键约束,但这种列级约束语法建立的外键约束不会生效,MySQL提供这种列级约束语法仅仅是为了和标准SQL保持良好的兼容性。

1. 在创建表时,可以添加外键
	* 语法:
		CREATE TABLE 表名(
			....
			外键列
			CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称)
		);

2. 删除外键
	ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

3. 创建表之后,添加外键
	ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);


4. 级联操作
    * 如果想定义当删除主表记录时,从表记录也会随之删除,则需要在建立外键约束后添加on delete cascade或添加on delete set null,
    * 第一种是删除主表记录时,把参照该主表记录的从表记录全部级联删除;
    * 第二种是指定当删除主表记录时,把参照该主表记录的从表记录的外键设为null;
    * 如果想定义当更新主表记录时,从表记录也会随之更新,则需要定义级联更新on update cascade。
    
	1. 添加级联操作
		语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 
				FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE  ;
	2. 分类:
		1. 级联更新:ON UPDATE CASCADE 或者 ON UPDATE SET NULL
		2. 级联删除:ON DELETE CASCADE

check约束

建立CHECK约束的语法很简单,只要在建表的列定义后增加check(逻辑表达式)即可。注意:MySQL支持建表时指定CHECK约束,但这个CHECK约束不会有任何作用。

	CREATE TABLE stu(
		id INT PRIMARY KEY AUTO_INCREMNET,
		name VARCHAR(20),
		CHECK(id>0)
	);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值