数据库常见约束类型(操作详解)

0. MySQL约束类型

约束名称描述
primary key主键约束,非空、唯一(不能重复)、索引
auto_increment自增
unique唯一键
foreign key外键
null / not null空/非空约束
default默认值(缺省值)
zerofill零填充
comment列描述 (用于描述属性字段的)

1. 主键

 主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。

注意:

  • 每个表只能定义一个主键。
  • 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。
  • 一个字段名只能在联合主键字段表中出现一次。
  • 【联合主键】不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。

1.1 创建主键

①: 创建表的时候,在字段名后指定primary key

create table 表名(id int primary key, name varchar(30));

②: 创建表的最后,指定某列或某几列为主键索引

create table 表名(
    id int,
    name varchar(30),
    primary key(id, name)
);

③: 创建表完成后,再添加主键

create table 表名(id int, name varchar(30));
alter table 表名 add primary key(id);

1.2 删除主键

alter table 表名 drop primary key;

2. 自增长

 它需要配合主键使用,有个这个约束,我们在向表中插入数据时,不需要额外关心主键的数据,他会自动帮我们维护一个递增的主键(系统会从当前字段中已有的最大值+1操作)。

特点:

  • 如果一个字段要作自增长,它的前提必须是一个索引
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长
mysql> create table test(
-> id int unsigned primary key auto_increment,
-> name varchar(10) not null default ''
-> );

• 查看auto_increment值

show create table table_name; -- 可以查看auto_increment的值(下一次的插入的值)

3. 唯一键

 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较

主键与唯一键的区别:

主键更多的是标识一条记录的唯一性,并且主键也有作为索引的key值的作用。
唯一键则是保证在业务上该字段的唯一性,为了防止其它字段插入相同的该字段的值。

3.1 创建唯一键

①: 创建表时,在某一字段后直接指定unique唯一索引

create table 表名(id int primary key, name varchar(30) unique);

②: 创建表的最后,在表的最后面指定某列或某几列为unique

create table 表名(
    id int primary key, 
    name varchar(30), 
    unique(name)
);

③: 表创建完成后,再对表进行修改,设置唯一键

create table 表名(id int primary key, name varchar(30));
alter table 表名 add unique(name);

3.2 删除唯一键

-- 1
alter table 表名 drop index 字段名;

-- 2
drop index 字段名 on 表名;

4. 外键

 外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

4.1 创建外键

• 创建表时,在最后添加外键

foreign key(外键字段名) references 主表(主表字段名)
create table class(
	id int primary key,
	name varchar(20) comment '班级名称'
);

create table student(
	id int primary key,
	name varchar(20) comment '学生名',
	class_id int comment '班级表的id',
	foreign key(class_id) references class(id)	-- 创建外键
);

• 表创建完成后,添加外键

alter table 表名 add [constraint 外键名] foreign key(外键字段名) references 主表(主表字段名)

注意: 上面"[]"里面的是可以不写的。自己不对外键起名字的话,MySQL会自动帮忙生成。

alter table student add foreign key(class_id) references class(id);

4.2 删除外键

删除外键,必须要知道外键的名称。(只要不是主键索引,其它索引的删除都需要知道索引名称)

       Table: tmp
Create Table: CREATE TABLE `tmp` (
  `SNO` int(11) NOT NULL,
  `CNO` int(11) DEFAULT NULL,
  `GRADE` decimal(5,2) DEFAULT NULL,
  KEY `fk_cno` (`CNO`),
  KEY `fk_sno` (`SNO`),
  CONSTRAINT `tmp_ibfk_1` FOREIGN KEY (`CNO`) REFERENCES `C` (`CNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

这里的tmp_ibfk_1就是外键名称。我们一会使用的删除操作必须用到这个名字。

alter table 表名 drop foreign key 外键名;

5. 空属性

mysql> create table myclass(
-> class_name varchar(20) not null,
-> class_room varchar(10) not null
-> );

 (非空属性可以配合缺省值一起使用)

• 空字段的性质

空字段是不参与运算的,包括比较

mysql> select null;
+------+
| NULL |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

mysql> select 1+null;
+--------+
| 1+null |
+--------+
| NULL |
+--------+
1 row in set (0.00 sec)

6. 默认值

 默认值就是用户不输入该字段的数据时,默认采取的值。

mysql> create table test(
    -> id int(8) zerofill primary key,
    -> name varchar(20) comment '姓名',
    -> gender varchar(10) default '保密' comment '性别'
    -> );
    
mysql> desc test;
+--------+--------------------------+------+-----+---------+-------+
| Field  | Type                     | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+-------+
| id     | int(8) unsigned zerofill | NO   | PRI | NULL    |       |
| name   | varchar(20)              | YES  |     | NULL    |       |
| gender | varchar(10)              | YES  |     | 保密    |       |
+--------+--------------------------+------+-----+---------+-------+

7. 零填充

 对于数字类型的后面给定的长度大小,是需要配合zerofill属性一起使用的。

-- 创建的表见"6. 默认值"
mysql> insert into test values
mysql> (1,'张三','男'),
mysql> (123456789,'李四','女');

mysql> select * from test;
+-----------+--------+--------+
| id        | name   | gender |
+-----------+--------+--------+
|  00000001 | 张三   | 男     | -- 表的id设置的宽度为8,不足8位长度的会在前面补0
| 123456789 | 李四   | 女     |
+-----------+--------+--------+

zerofill的作用: 如果宽度小于设定的宽度,那么它会自动填充0。(注意,它这里只是在显示上给你显示的是前面有很多0,实际上在MySQL数据存储中还是1,它只是一种格式化输出)

8. 列描述

 使用comment在创建表时,在某一字段后面添加列描述。

mysql> show create table test \G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(8) unsigned zerofill NOT NULL,
  `name` varchar(20) DEFAULT NULL COMMENT '姓名',
  `gender` varchar(10) DEFAULT '保密' COMMENT '性别',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值