码迷,mamicode.com
首页 > 数据库 > 详细

MySQL列属性约束及存储引擎

时间:2015-08-02 16:54:22      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:约束   引擎   mysql   

列属性约束,保证表的结构和数据的正确性和稳定性。

总的来说有五种:唯一性和主键约束、外键约束、检查约束、空值约束、默认值约束。
五大关键词:UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT
技术分享

是否为空

规定一个字段的值,是否可以是null。
null(默认) 或 not null
Null表示没有值。与任何数据不同。表示什么都没有。
如果一个列不允许为空,但是在赋值时,没有为该字段赋值,则会出现问题。
Mysql的每条记录,如果存在可以为null的字段,则需要使用一个字节保存哪些字段是空。

create table one(
a int not null,
b int 
);
insert into one (a) values(10);
select * from one;

默认值属性

使用default value来声明
DEFAULT子句用于为列指定一个默认,当该字段不存在值时,会被启用。
默认值必须为一个常数,不能为一个函数或一个表达式。
可以不存在default,但是mysql会判断:
如果该列可以为空,则默认值为null;如果不可以,则不设置默认值。

注意:
可以在处理数据时,使用default,显示地使用默认值。
有些列是不能有默认值的:Blob,text。
时间戳类型,可以设置一个特殊的默认值 CURRENT_TIMESTAMP。在当列不存在或者传递的值为null时,使用当前的时间戳。

drop table two;
create table two(
a int not null default 10,
b int not null default 20, 
c int default 30,
d int
);
insert into two(a) values(10);
insert into two(b) values(10);
select * from two;

技术分享
默认值,在没有为该字段设置值是启用。
而且默认值的设置需要使用固定值。

常见场景
一个字段不能为空,而且存在默认值。

主键约束

主键(PK,primary key)就是可以唯一标识某条记录的字段或者是字段的集合。
主关键字是表中的一个或多个字段,要求主键的值不能重复,只能有一个主键。
如果还存在不重复的记录,可以定义成唯一索引,提高检索效率。
主键不能为空,不设置或者null都会变成not null。


主键可以是真实实体的属性
但是常用的好的解决方案是:
利用一个与实体信息不相关的属性,作为唯一标识。
主键与业务逻辑不发生关系。只用来标识记录。(自身保证不冲突,主键不属于当前实体的任何属性。)

设置主键的语法:通过primary key完成
两种方案:
1、字段上设置

drop table teacher;
create table teacher(
t_id int primary key,
t_name varchar(10),
classname varchar(6),
days tinyint unsigned
)character set gbk;
insert into teacher values(1,‘周杰伦‘,‘0324‘,32);
insert into teacher values(-1,‘刘德华‘,‘0334‘,35);

show create table teacher\G

主键不能为空,也不能重复。一个字段是主键的话,自动设置不为空。

2、在定义完字段后,可以定义
通过这种方式可以定义多列主键。

create table teacher(
t_id int,
t_name varchar(10),
classname varchar(6),
days tinyint unsigned,
primary key (t_id)
);

组合主键

drop table teacher;
create table teacher(
t_name varchar(10),
classname varchar(6),
days tinyint unsigned,
primary key (t_name,classname)
);

注意:
组合主键表示一个主键内包括多个字段,而不是多个字段都是主键;只需要一个唯一标识即可,mysql规定只能存在一个主键。

可以通过修改表来删除主键 alter table tbl_name drop primary key;
主键字段原则上在插入后,应该不被修改,但是语法上可以修改,但是修改的值不能与已有值冲突。

主键常见的设计:
每个表都应该存在一个可以唯一标识的主键字段,
最好与实体没有联系,不是实体属性字段。

自动增长

为每条记录提供给一个唯一的标识。
每次插入记录时,将每个字段的值自动增加1。
使用auto_increment标识。

需要整型,还需要有索引。

通常自动增长是从1开始递增,但是可以通过修改表属性,更改初始值。
表属性 auto_increment=x;(如果比已存在的小,则会从已有的最大值新记录)

drop table teacher;
create table teacher(
t_id int primary key auto_increment,
t_name varchar(10),
classname varchar(6),
days tinyint unsigned
);
insert into teacher values(null,‘周杰伦‘,‘0324‘,32);
insert into teacher values(null,‘刘德华‘,‘0334‘,35);

insert into teacher (t_name,classname,days)values(‘周韦彤‘,‘0324‘,31);

select * from teacher;

技术分享

自动增长的初始值:是可以设置的,默认是1。
通过表的选项:auto_increment n

alter table teacher auto_increment 10;
select * from teacher;
insert into teacher values(null,‘范冰冰‘,‘0334‘,35);
select * from teacher;

技术分享

自动增长是否可以手动插入该列的值?
仍然可以手动插入。
如果是主键的话,该列不能重复,否则,可以重复。
insert into teacher values(7,’范冰冰’,’0334’,35);

自动增长该列是否可以更新?
可以

update teacher set t_id=100 where t_name=‘范冰冰‘;
delete from teacher where t_name=‘范冰冰‘;

技术分享

实体之间的关系

1:1 一对一
两个实体表内,存在相同的主键字段。
如果记录的主机值等于另一个关系表内的记录的主机主键值,则两条记录一一对应。

1:n 一对多
一个实体,对应多个其他实体
例如:一个班级对应多个学生

设计:
在多的那端,增加一个字段,
用于指向该实体所属的另外的实体的唯一标识,即主键。

m:n 多对多
设计:
典型的是利用一个中间表,表示实体之间的关系。

中间表的每个记录,表示一个关系。
一个M:N可以通过1:M,1:N来实现。

技术分享

外键

如果一个实体(student)的某个字段(class_id),指向(引用)另一个实体(class)的主键(class_id),就称student实体的class_id是外键。

被指向的实体(class),称之为主实体,也叫(父实体)。
负责指向的实体,称之为从实体(从表),也叫子实体(子表)。

作用:
用于约束处于关系内的实体。

需要解决的问题?
增加子表记录时,是否有与之对应的父表记录。
在删除或者更新主表记录时,从表应该如何处理相关的记录。

如何定义一个外键?
在从表上,增加一个字段,指向主表的主键。
使用关键字 foreign key

drop table if exists class;
create table class(
class_id int primary key auto_increment,
class_name varchar(20) not null default ‘deeplearning‘ comment ‘班级名称‘
)character set utf8;

set names gbk;客户端与服务器端通信的编码
character set utf8这里的utf8是数据存储到服务器的编码。

drop table if exists student;
create table student(
stu_id int primary key auto_increment,
stu_name varchar(10) not null default ‘‘,
class_id int,
foreign key (class_id) references class(class_id)
)character set utf8;

必须主表里面先有数据,才能在从表中插入数据。

insert into class values (null,‘c program design‘);
insert into student values (null,‘张三丰‘,1);

设置级联操作
在主表数据发生改变时,与之关联的从表数据应该如何处理。
主表更新,主表删除时:使用关键字on updateon delete来标识。

允许的级联动作:
cascade关联操作,如果主表被更新或删除,那么从表也会执行相应的操作。
set null,设置null,表示从表不指向任何主表记录。
restrict,拒绝主表的相关操作。

修改外键:
先删除,再新建,通过修改表完成。
alter table table_name drop foreign key(class_id);
删除外键需要用指定外键名称达到目的,可以通过在创建外键时指定名称
或者使用mysql默认生成的名称。
show create table student\G

技术分享

alter table student drop foreign key student_ibfk_1;

增加外键,设置删除时将从表的数据设置为null
alter table table_name add foreign key(外键);

alter table student add foreign key (class_id) 
references class(class_id)
on delete set null;

show create table student\G

select * from class;
select * from student;

delete from class where class_id=2;
select * from class;
select * from student;

on delete
增加外键,设置删除时将从表的数据同时也删除。

insert into class values (1,‘c program design‘);
update student set class_id=1 where stu_id = 1; 

alter table student drop foreign key student_ibfk_1;

alter table student add foreign key (class_id) 
references class(class_id)
on delete cascade;

select * from class;
select * from student;
delete from class where class_id=1;
select * from class;
select * from student;

on update
指的是只有主表的主键发生变化,才会对从表产生影响。

insert into class values (1,‘c program design‘);
insert into student values (1,‘张三丰‘,1);

select * from class;
select * from student;

alter table student drop foreign key student_ibfk_1;
alter table student add foreign key (class_id) 
references class(class_id)
on delete cascade
on update restrict;

update class set class_id=2 where class_id=1;不能操作成功

更新存在关联的主表数据的主键字段

alter table student drop foreign key student_ibfk_1;
alter table student add foreign key (class_id) 
references class(class_id)
on delete cascade
on update cascade;

存储引擎

技术分享
默认的服务器表类型,通过my.ini可以配置。
default-storage-engine=INNODB

在创建表或编辑表时,可以指定表的存储引擎。
利用表属性:engine 引擎类型
通过engine myisam,engine innodb 在创建时指定。

alter table class engine myisam; 不能操作成功,有外键。

注意:外键只被innodb存储引擎所支持。其他引擎是不支持的。

create table classroom(
room_id int primary key auto_increment,
room_no char(3)
)engine myisam character set utf8;

myisam与innodb区别
1、保存文件的方式不同
myisam:一个表三个文件。tablename.frm结构,tablename.myd数据,tablename.myi索引
innodb:一个表一个文件。tablename.frm结构
所有的innodb表,都使用相同的innodb存储表空间在保存数据和索引。

2、Innodb很多时候是行级锁,而myisam是表级锁,innodb的并发高

3、MyIASM支持索引压缩,而Innodb索引和数据是绑定保存不压缩,体积大。

4、InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,
但是MyISAM只要简单的读出保存好的行数即可。
注意:当count(*)语句包含 where条件时,两种表的操作是一样的。

myisam适于插入,查找。
innodb适于更新,删除。

选择存储引擎的依据:
1、性能
2、功能

版权声明:本文为博主原创文章,未经博主允许不得转载。

MySQL列属性约束及存储引擎

标签:约束   引擎   mysql   

原文地址:http://blog.csdn.net/scgaliguodong123_/article/details/47205637

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!