数据库的约束详解(1)

数据库的约束详解(1)

    数据库中的约束是为了保证数据表里数据的完整性。约束是在表上强制执行数据的校验规则,除此之外,当表中数据存在相互依赖性时,可以保护相关的数据不被删除。
    大部分的数据库支持以下常见的五种完整性约束。
    1. NOT NULL: 非空约束,指某列不能为空。
    2. UNIQUE:    唯一约束,指定某列或则几列组合不能重复。
    3. PRIMARY KEY: 主键约束,指定该列的值可以唯一地标识该条记录。
    4. FOREIGN KEY: 外键约束,指定该行记录从属于主表中的一条记录,主要用于保证参照完整性。
    5. HCECK: 检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。

    MySQL不支持CHECK约束,约束也是数据库对像,并被存储在系统表中,也拥有自已的名子。

    根据约束对数据列的限制,约束可以分为单列约束和多列约束。在创建表的时候指明约束,也可以在创建后,以修改表的方式增加约束。

    约束的语法形式分为:
    1.列级约束    
	create table table_name(
                字段1 数据类型  约束类名,
		字段2 数据类型,
		字段3 数据类型,
	);
    2. 表级约束    
	create table table_name(
		字段1 数据类型,
		字段2 数据类型,
		字段3 数据类型,
		constraint 约束名 约束类名(field1,field2...)
	);
    上面是创建表时指明的,以修改表的方式添加或删除约束的方法如下,不同的方式适用于不同的情况。
    1. 添加约束       
 
    方式1:alter table table_name add 约束名(field1,field2...);
    方式2:alter table table_name modify 字段 字段类型 约束名;
    注意:NOT NULL约束不支持add的方法,只能采用modify
    2. 删除约束
    大部分的数据库采用“drop constraint 约束名”语法来删除约束,但是在mysql中要使用“drop index 约束名”。如果不知道约束名,可以采用show create table table_name命令来查看表的创建信息,从而知道约束名,然后再执行下面的命令: 
 
 alter table table_name drop index 约束名
    一. NOT NULL约束
    首先,需要说明,NULL是空,不知道!不是0,也不是空字符串,所有的数据类型都可以是NULL,包括int,float等。
    创建表时,指定列为非空约束只要在列定义后加上NOT NULL即可。
    可以采用如下命令去修改一列为空/非空约束,同时指定默认值。    
  alter table table_name 字段名 字段类型 [default 默认值] NULL/NOT NULL;
    如果该列有NOT NULL约束,那么插入记录时,必须显式的给定一个不为NULL的值,或者将该列设置为不为NULL的默认值,这样插入时可以不理会该列。

    因为表中每一列都是由列名和数据类型组成,所以在使用modify命令时,后面都要跟上完成的列,然后再跟上约束类型。

    二. UNIQUE 约束
    唯一性约束用于指定某列不能出现重复值,有一个例外是,虽然该列不能出现重复的值,但可以出现多个NULL值,因为数据库中NULL不等于NULL;
    注意:同一个表内可以建多个唯一约束,唯一约束也可以由多个列组成。当为某列创建唯一约束时,MySQL会为该列相应的创建唯一索引。如果不给唯一约束起名,它默认与列名相同。
    列级唯一约束直接在列属性后面加上unique。
    表级唯一约束可以采用下面的语法形式:
    [constraint 约束名] 约束定义(字段1,字段2...)


    添加和删除唯一约束
    添加     
alter table table_name add unique(字段1,字段...);
               alter table table_name modify 字段 数据类型 unique;
    删除:
 alter table table_name drop index 约束名(默认等于列名);

    创建表时添加唯一约束:   
 create table table_name(
		字段1 数据类型,
		字段2 数据类型,
		字段3 数据类型,
		constraint 约束名 unique(字段1,字段2...)
    );
    如果该列有UNIQUE约束,那么插入记录时,该列的值在表中不能存在,否则报错。

    三. PRIMARY KEY 约束
    主键约束相当于非空约束和唯一约束的组合,既不能重复,也不能为NULL。如果为多列创建主键约束,那多列中包含的每一个列都不能为空,但只要求这些组合不能重复。
    什么意思?比如一个学生信息表,可以用学号作为主键,学号可以唯一标识一条学生信息,但是学号一般又由什么构成呢?一个学校的学号编排规则一般是 年级+班级+班级中学生编号,其中班级中的学生编号是不能得复的!
    
    每一个表中最多只能有一个主键,但这一个主键可以有多列组成,同样主键约束的添加也有列级约束语法和表级约束语法。
    当创建主键约束时,MySQL在主键约束所在列或列组合上建立对应的唯一索引
    
    关于主键约束,还有一点是主键自增,采用auto_increment关键字来设置。     
  create table table_name(
		字段1 数据类型 auto_increment primary key,
   		字段2 数据类型
    );
    指定自增长功能通常用于设置逻辑主键列——该列的值没有物理意义,仅仅用于标识每行记录。
   主键创建相关的SQL语句:
   1. 使用列级约束语法    
	create table table_name(
		id	int primary key,
		name varchar(10)
	);
    2. 使用表级约束语法
create table table_name(
		id int,
		name varchar(10)
		primary key(id)
	);
    3. 使用表级约束语法创建联合主键,并命名为pk
create table table_name(
		id int,
		name varchar(10),
		constraint pk primary key(id,name)
	);
    4. 查询一个表的主键
    desc table_name;     查看表的结构,KEY字段下面是否标明PRI,这也是查看其它约束的方法
    或
    show create table table_name \G 可以查看表创建的详细信息(包括存储引擎和编码类型)
   
5. 给表增加主键  
alter table table_name add primary key(字段1,字段2...);
   	或
   	alter table table_name modify 字段名 数据类型 primary key;
    第一种方法可以添加联合主键,第二种方法只能把一列设置为主键
    6. 给主键设置自动增长
alter table table_name modify id int auto_increment primary key;
    7. 删除表的主键,如果设置了自动增长要先删除自动增长,否则报错
    通过show create table table_name看到字段的属性,又由上面的6可知设置自动增长的方法。所以删除自动增长本质上就是更改字段属性。
    删除自动增长,实际上就是修改属性:     
alter table table_name change id id int;
    删除主键,因为一个表中只有一个主键,所以不用指定名子。     
alter table table_name drop primary key;

    四. CHECK约束
    MySQL支持建表时指定CHECK约束,但是不会起作用。CHECK的语法很简单:     
create table tabl_name(
	id int auto_increment,
	name varchar(10),
	salary decimal,
	primary key(id),
	check(salary > 0)
);
    从上面可以看出,在建表时,只需要在列后面指定check(逻辑表达式)即可。

    还有一个外键约束,在下一节学习。
   
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值