目录
前言:
1,空属性
2,默认值default
3,列描述
4,zerofill
5,主键
6,自增长
7,唯一键
8,外键
9,综合案例
前言:
在MySQL中,表的束缚用于逼迫保证数据的完备性和同等性。在数据库表中,真正束缚字段的是数据范例,数据范例传送门:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/145947883但是数据范例的束缚很单一,以是需要一些额外的束缚,来保证数据的完备性和正确性。表的束缚有许多,这里重要先容如下几个:
null / not null,default,comment,zerofill,primary key,auto_increment,unqiue key
1,空属性
- 两个值:null和not null,一般环境下,如果不指明,默认为null
- 数据库默认字段都是空,但在现实开辟中,尽可能保证字段不为空,由于数据为空时无法参与运算
示例:
create table if not exists myclass( class_name varchar(20) not null,class_room varchar(20) not null);
insert into myclass values ('高三一班','101');
insert into myclass values (null,'101');//err不能插入空值
insert into myclass values ('高三一班',null);//err不能插入空值
2,默认值default
插入数据时,若未指定字段,则使用默认值。
示例:
create table t11(
-> name varchar(20) not null,
-> age tinyint unsigned default 10,
-> sex char(2) default '男');
数据在插入时,不给字段赋值就是用默认值。
insert into t11 (name,age) values ('张三',18);
insert into t11 (name,age,sex) values ('李四',20,'女');
insert into t11 (name,sex) values ('王五','男');
insert into t11 (name) values ('赵六');
补充:我们可以查看建表时我们设置了那些束缚
show create table t11\G
在创建表时,如果没有指明字段的束缚,体系会将字段的默认值default设置为null
3,列描述
列描述:comment,没有现实含义,专门用来描述字段,会根据表创建语句生存,起到解释的作用
示例:
mysql> create table t13(
-> name varchar(20) not null comment '姓名',
-> age tinyint unsigned default 0 comment '年龄',
-> sex char(2) default '男' comment '性别');
通过desc查看不到解释信息,通过show可以查看到
4,zerofill
zerofill的作用如果宽度小于给定的宽度,就用0填充。具体看操作.
mysql> create table t14( a int unsigned not null, b int unsigned not null);
- 将字段b修改为int unsigned zerofill not null
mysql> alter table t14 modify b int unsigned zerofill not null;
mysql> show create table t14\G
可以看到int(10),这个10所表现的含义是b这个数的宽度,如果插入的数据宽度小于10,就补0,如果宽度大于10,就按原数据插入。而为什么是10呢?由于无符号int的取值范围是42亿多,宽度是10。
mysql> insert into t14 values (1,1);
mysql> insert into t14 values (1,11111111);
mysql> insert into t14 values (2,222);
mysql> select * from t14;
- 修改字段a的束缚为int(5) unsigned zerofill
mysql> alter table t14 change b b int(5) unsigned zerofill;
mysql> show create table t14\G
mysql> select * from t14;
可以看到,对于int(10),没有zerofill属性,括号内的值毫无意义。
5,主键
主键(Primary Key):用来唯一的束缚该字段里面的数据,不能为空,不能重复,一张表最多有一个主键;主键所在的列通常是整数范例。
示例:
mysql> create table t15(
-> id int unsigned primary key comment '学号不能为空',
-> name varchar(20) not null);
- 主键束缚:主键对应的字段不能重复,一旦重复,操作失败。
alter table 表名 drop primary key;
alter table 表名 add primary key (字段列表);
在创建表的时间,在所有字段之后,使用primary key来创建主键,如果有多个字段做主键,使用复合主键。
mysql> create table t16(
-> id int unsigned,
-> course char(10) comment '课程',
-> score tinyint unsigned default 60 comment '结果',
-> primary key(id,course));
从上图可以看出字段id和course都是主键,id和course共同构成一个主键,站在业务角度,可以保证一个门生对应的学号id,在选课程course时不能选择重复的课程。示例:
mysql> insert into t16 (id,course) values (1,'数据布局');
mysql> insert into t16 (id,course) values (1,'算法设计与分析');
mysql> insert into t16 (id,course) values (1,'操作体系');
mysql> insert into t16 (id,course) values (2,'数据布局');
mysql> insert into t16 (id,course) values (2,'算法设计与分析');
mysql> insert into t16 (id,course) values (2,'操作体系');
mysql> insert into t16 (id,course) values (1,'操作体系');//err主键冲突
mysql> insert into t16 (id,course) values (1,'数据布局');//err主键冲突
6,自增长
auto_increment:当对应的字段,不给值,会自动的被形同触发,体系会从当前已有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
- 任何一个字段要做自增长,条件是自己是一个索引(key一栏不为空)
- 自增长字段必须是整数
- 一张表只能有一个自增长
示例:
mysql> create table t17(
-> id int unsigned primary key auto_increment,
-> name varchar(10) not null);
mysql> insert into t17 (name) values ('a');
mysql> insert into t17 (name) values ('b');
mysql> insert into t17 (name) values ('c');
- 通过show可以查看auto_increment信息
mysql> show create table t17\G
- 在创建表的时间,也可以指明auto_increment的值
mysql> create table t18(
-> id int unsigned primary key auto_increment,
-> name varchar(20) not null)auto_increment=100;
- 可以通过调用函数last_insert_id(),获取前次插入的auto_increment值
7,唯一键
- 一张表中往往有许多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性束缚的题目。
- 唯一键的本质和主键差不多,唯一键答应为空,而且可以多个为空,空字段不做唯一性比力。
- 关于唯一键和主键的区别: 我们可以简朴理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。
举一个例子:
假设一个场景: 比如在公司,我们需要一个员工管理体系,体系中有一个员工表,员工表中有两列信息,一个身份证号码,一 个是员工工号,我们可以选择身份号码作为主键。
而我们设计员工工号的时间,需要一种束缚:所有的员工工号都不能重复。 具体指的是在公司的业务上不能重复,我们设计表的时间,需要这个束缚,那么就可以将员工工号设计成为唯一键。 一般而言,我们发起将主键设计成为和当前业务无关的字段,如许,当业务调解的时间,我们可以只管不会对主键做过大的调解。 示例:
mysql> create table student(
-> id char(10) unique key comment '学号',
-> name varchar(10));
8,外键
外键用于定义主表和从表之间的关系:外键束缚重要定义在从表上,主表则必须是有有主键束缚或unique束缚。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。 作用:维护表间的引用完备性,防止无效数据插入。
语法:
foreign key(字段名) references 主表(列);
其中门生表为从表,班级表为主表。
示例:
mysql> create table class(
-> id int primary key,
-> name varchar(20) not null comment '班级名');
mysql> create table student(
->id int primary key,
->name varchar(20) not null comment '门生名',
->class_id int,
->foreign key(class_id) references class(id));
mysql> insert into class values (1,'软件101');
mysql> insert into class values (2,'软件102');
mysql> insert into class values (3,'软件103');
mysql> insert into student values (100,'张三',1);
mysql> insert into student values (200,'李四',2);
mysql> insert into student values (300,'王五',3);
mysql> insert into student values (400,'赵六',3);
mysql> insert into student values (500,'田七',4);//err
- 插入一个班级id为4的门生,由于没有这个班级,以是插入不乐成
- 插入一个班级id为null的,表现该门生还没有分配班级
mysql> insert into student values (500,'田七',null);
9,综合案例
有一个市肆的数据,记录客户及购物环境,有以下三个表组成:
- 商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品种别category, 供应商
- provider)
- 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)
- 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)
要求:
- 每个表的主外键
- 客户的姓名不能为空值
- 邮箱不能重复
- 客户的性别(男,女)
- //创建数据库
- mysql> create database d1;
- //选择数据库
- mysql> use d1;
复制代码 商品:
- create table if not exists goods
- (
- goods_id int primary key auto_increment comment '商品编号',
- goods_name varchar(32) not null comment '商品名称',
- unitprice int not null default 0 comment '单价,单位分',
- category varchar(12) comment '商品分类',
- provider varchar(64) not null comment '供应商名称'
- );
复制代码 客户:
- create table if not exists customer
- (
- customer_id int primary key auto_increment comment '客户编号',
- name varchar(32) not null comment '客户姓名',
- address varchar(256) comment '客户地址',
- email varchar(64) unique key comment '电子邮箱',
- sex enum('男','女') not null comment '性别',
- card_id char(18) unique key comment '身份证'
- );
复制代码 购买
- create table if not exists purchase
- (
- order_id int primary key auto_increment comment '订单号',
- customer_id int comment '客户编号',
- goods_id int comment '商品编号',
- nums int default 0 comment '购买数量',
- foreign key (customer_id) references customer(customer_id),
- foreign key (goods_id) references goods(goods_id)
- );
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |