day 39 mycql 数据库之约束
egon笔记:
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键) create table t13(id int primary key auto_increment); FOREIGN KEY (FK) 标识该字段为该表的外键 #先建被关联的表
create table course(
id int primary key auto_increment,
cname char(20),
comment char(60)
);
insert into course(cname) values
('python全栈开发'),
('linux运维'),
('python自动化开发'); #再建
create table student(
id int primary key auto_increment,
sname char(16),
age int,
cid int,
foreign key(cid) references course(id)
on delete cascade
on update cascade
); insert into student(sname,age,cid) values
('egon',18,1),
('alex',38,2),
('wxx',28,1),
('yxx',2,1);
创建表时添加联合唯一或者联合主键原生sql:
联合唯一字段:
create table task (
mission_id int primary key auto_increment,
p_id int not null,
foreign key (p_id) references employee_information(person_id) on delete cascade on update cascade,
mission_dirname char(80) not null,
unique key(p_id, mission_dirname)
); 联合主键字段:
create table task (
mission_id int auto_increment,
p_id int not null,
foreign key (p_id) references employee_information(person_id) on delete cascade on update cascade,
mission_dirname char(80) not null,
primary key(p_id, mission_dirname)
);
-- 先正常写完所有字段的具体约束,然后在句尾加一个逗号,再来写联合唯一的字段或者是联合主键的字段,用括号括起来,括号里面的字段用逗号间隔。
内容概要:
-- 1 .回顾
聚合函数:
最大 max()
最小 min()
平均 avg()
求和 sum()
总个数 count()
分组函数 : group by having
排序 order BY ASC desc
去重复 :distinct
分页: limit 参数1:从第几条开始,起始位置为0,参数2:显示的条数
多表联合查询 (笛卡尔乘积)
左连接查询 :A left join B on 条件 left join C on 条件
右连接查询 : right join
内连接查询 : inner join 删除重复数据:
delete from ren where p_name in (
select * from (select p_name from ren GROUP BY p_name HAVING count(1)>1) as h
)
删除重复数据并保留ID最大的是数据
delete from ren where p_name in (
select * from (select p_name from ren GROUP BY p_name HAVING count(1)>1) as h
)
and p_id NOT IN(
select * from(select max(p_id) from ren GROUP BY p_name HAVING count(1)>1) T
) 今日内容:
mysql 约束:
1.非空约束:
not null 2.主键约束
create table t2 (
id int not null PRIMARY key,
name VARCHAR(200) not null,
age int not null, )
注意: 不能为空,不能重复,一个表中只能有一个主键 3. 唯一约束
create table t4(
id int(10) not null,
name varchar(255) ,
age int ,
unique name_age(name,age)
);
注意:被约束的字段不能重复 *4.外键 foreign key -- 部门表
create table dept(
dept_id int(30) not null auto_increment primary key,
dept_name varchar(255) not null
);
-- 员工表
create table emp(
id int(10) not null auto_increment primary key,
name varchar(50) not null,
dept_id int(10) not null,
constraint f_key foreign key (dept_id) references db2.dept(dept_id) on delete cascade
); 5. 默认值 default
create table t5 (
id int not null auto_increment PRIMARY key,
name VARCHAR(255) not null DEFAULT 'wusir'
) 2.数据库设计
1.概念
1.有效存储数据
2.满足用户的多种需求 2.关系
1-1 :最少需要1张表
1-n :最少需要2张表
n-n :最少需要3张表 3.数据库三范式
1.保证每列的原子性
2.保证每列都与主键相关
3.保证每列都和主键直接相关,而不能是间接相关
三范式的详解:http://www.cnblogs.com/wangfengming/p/7929118.html 3. 索引:
1.概念:相当于书的目录,快速找到数据 好处:可以帮助你提高查询效率,数据量越大越明显
缺点: 新增和删除数据时,效率较低 2.索引方法:
1.hash 是以key-value 的形式进行索引存储
2.BTree 是以二叉树方式进行索引存储。(默认存储索引类型) 3.索引分类
1. 普通索引 create INDEX name_index on person(name);
2. 唯一索引 create unique INDEX name_age on person(name,age);
3. 主键索引 alter table person MODIFY id int PRIMARY key;
4. 组合索引 create unique INDEX name_age on person(name,age);
5. 全文索引 full text :原理是分词查找 练习:http://www.cnblogs.com/wangfengming/p/7978183.html
约束的存在是为了确保表的唯一性.它的存在是一种限制,通过对表的行或者列的数据做出限制,
常用约束有主键,非空,唯一性,外键,默认值
1,非空约束,就是改列在插入数据的时候不能为空,
2,主键约束,是用于约束表中的一行,作为这一行的标识符,在一张表中通过主键就能准确定位到一行,后期遇到查询检索内容的时候,通过主键去查询速度和效率会比其他的字段快很多.
注意: 主键这一行的数据不能重复且不能为空。另外还有一种符合主键,不常用,但是要了解,主键可以是很多列,不仅仅局限于一列,当是多列的时候,例如A与B都是主键的时候,在插入数据值时,只要不满足A与B的值都相同的情况即可,可以A的值相同,也可以B的值相同,但是不能两者同时相同.
3,唯一约束,规定一张表中指定的一列的值必须不能有重复的 ,就是在填入值的时候,这一列里面每次添加的值都不能够重复,例如你第一次用insert的时候在该列里面插入了一个0,那么下次的时候在用insert插入数据的时候,就不可以再写入0,否则会报错,这里就是唯一约束的效果.应用场景,比如在个人信息表中,身份证和电话号码还有学号都是唯一的 ,不可以有重复的,那么为了不设置那么多的主键,我们就设置一个唯一约束,也能达到同样的效果.
4,外键既能确保数据的完整性,也能表现表之间的关联关系.(注意:一个表可以有多个外键,被外键约束的列,取值必须在它参考的列中有对应值).也就是说我们的两个表员工表和部门表,用员工去关联部门,那么我要删除部门的时候,(例如一个公司里面的一个部门无法运营下去就要面临解散,)部门里面的人被员工表关联着是无法进行删除操作的,我们要把该部门里面的人在员工表里找到然后删除掉,再回去部门表里面,删除该部门,那就可以了删除了,还有一个情况可以解决这个问题:
create table student(
id int primary key auto_increment,
sname char(16),
age int,
cid int,
foreign key(cid) references course(id)
on delete cascade
on update cascade
);
在外键约束里面把删除和修改类型的模式改一下,用到cascade模式,这样与之关联的表格和字段都会跟着删除和改变,你改动了其中一个,另一个也会同步操作.
create table part1(
p_id int primary key auto_increment not null ,
name varchar(50) not null,
constraint id foreign key (p_id) references liuyandb.tr(id) on delete no action
)
-- 我们来这里分析一下这行命令,先建立一个表格,然后把字段和约束条件都放进去,这都没什么好说的,最后一行里面,我们来细分析一下这句话,
-- constraint是约束的意思,然后它后面的字段名是你创建的新表格的外键,然后接上关键字foreign key关键字,然后是自己新创建的列表里面的字段(为该字段添加外键),
-- 然后是关键字references,后面接上你想给新列表里面的字段添加的外键所在的绝对路径,也就是该字段所在的列表名,以及列表所在的数据库名.然后最后再接上delete删除的选项.
5,默认值约束当有default约束的列,插入的改列数据为空时,则显示默认设置的初始值,此概念类似于函数里面的默认参数,当不传参的时候就使用默认的参数,传参则使用所传的参数.
=================================================================================================================================
数据库的设计,
设计数据库需要满足连个条件,---------有效存储数据,同时还要满足用户一切需求,
规则,三范式;
1,确保每列的原子性,----即每一列的内容都不可以再拆分,(因为已经拆分到足够详细了,例如,地址信息,拆分成国家,省份,市区,街道,楼号,几层,) 小到不能再小了
2,确保表中的每列都和主键相关
3,确保每列都和主键直接相关,不能是间接相关
数据库与表的关系;
1,一对一关系,举例说明更容易理解一些,就拿公司招聘来说,在电影(幸福来敲门)举例,里面的黑人爸爸,他对数字感兴趣然后去面试了一家公司,那个公司里面有30多个人要竞聘一个岗位,如果我们来 建立一个表格把这三十多个人 都放进去,那么这个表格我们就称之为"实习员工表",然后试用期过后,只有一个人会成功被雇佣其余人都会被fire掉,这里我们为了表格的设计场景考虑,假设它 最后会雇佣5个人,那么我们需要建立一个表格把这5个人单独存放起来,这个表格就叫做'新入职员工表',所以我们最后得到了2个表格,即是:"实习员工表","新入职职员表",这两个表格里面其中实习员工表格里的每一条数据都是一个实习工,然后新入职职员表里面每一条数据都是新入职员工,新入职的员工都是要跟实习员工表里面的数据关联上的,因为我们的每一个正式入职的员工都要从实习员工转换过来,所以这里我们的新入职职员表需要关联到实习员工表格,
这里提到了一个关联的概念,谁关联谁,A要关联B,那么就需要先有B然后才能有A ,如果你关联的表格还没有存在的话,那你是无法实现关联的,会报错,所以我们的新入职职员表 要关联到实习员工表,也就是说要先有实习员工,然后才能有新入职职员表.create table table_name(x int primary key unique,y char(10),foreign key (x)references course(id) )-----{这里解释一下foreign key这句话的意思,写法格式如上面一行,这就是规范的写法,foreign 是写在要主动关联别人的表格里面的,然后key后面的括号里加上所需要关联的自己的本表格里面的字段,然后references后面接上要与之关联的表格的名字,然后名字后面的括号里面把字段名加上}好了这里谁关联谁的问题解决了,然后就是一对一的关系的理解了[因为是一对一的关系,也就是说一行内容只能关联到另一个表格的一行内容不能够有重复的,所以必须要加上unique的约束]
我们上面提到了两个表格,一个表格是实习员工表,还有一个是新入职职员表,我们从实习员工表格里面随便取一条数据,然后去关联新入职职员表,会发现每一个实习员工都有可能成为一个正式员工,一个对应一个,不可能我们的一个实习员工去对应上多个正式员工.然后反过来,我们的一个新入职员工去对应实习员工表,会发现都是一条数据对应一个数据,而且只能是这种情况,那么我们就说这是一对一关系.
2,一对多关系,我们根据上面提到的两个表格,这里在创建两个表格一个是员工表格,一个是部门表格,用员工表格去关联部门表格,一个员工只能是一个部门里面的,(正常情况下是这样的除非是创业公司,恨不得你一个人干很多人的活,正常的公司都是术业有专攻的),然后反过来,一个部门里面可以关联多个员工,这就叫做一对多关系,也叫多对一关系,
3,多对多关系,一个是课程表,一个是学员表,一个学员可以学多门课程,反过来一个课程里面可以有多个学生学,互相都能够彼此关联,这种就是多对多关系,在这里我们的多对多关系,需要注意的一点是,上面我们提到了两个表格A去关联B的时候,会有一个先后顺序出现的,要先有B然后才能有A,倒过来就不成立的,会报错,那么我们的多对多关系里面,
A可以关联B,反过来B可以关联A,那么他们二者都互相等待对方先创建,这里就会有冲突出现了,所以我们就需要第三个表格来缓解这个问题,
=============================================================================================================================
day 39 mycql 数据库之约束的更多相关文章
- Mysql 数据库设置三大范式 数据库五大约束 数据库基础配置
数据库设置三大范式 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式. 第一范式的合理遵循需要根据系统给的实际需求 ...
- 改写了禁用或启用oracle数据库的约束的存储过程
改写了网上某位大侠(最开始的源头是哪位没记住)写的禁用或启用oracle数据库所有约束的存储过程,增加了异常控制,以使发生异常时也可以执行下去. –调用过程: 执行前先 set serveroutpu ...
- Sql Server——运用代码创建数据库及约束
在没有学习运用代码创建数据库.表和约束之前,我们只能用鼠标点击操作,这样看起来就不那么直观(高大上)了. 在写代码前要知道在哪里写和怎么运行: 点击新建查询,然后中间的白色空白地方就是写代码的地方了. ...
- 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)
1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...
- ORCAL 数据库的约束以及SQL语言的四种类型
oracle数据库约束: 定义:要输入的这个值是一个什么样的值, 或者是哪个范围内的值 作用: 确保完整性, 确保精确性 1, 非空约束(not null) 记录一条信息的时候如果用户名和密码没有被记 ...
- day38:MySQL数据库之约束&索引&外键&存储引擎
目录 part1:数据类型 part2:约束 part3:主键索引 PRI &唯一索引 UNI &普通索引 MUL part4:外键:foreign key part5:在外键中设置联 ...
- sql点滴39—解决数据库日志文件过大的问题
随着数据库使用时间增长,日志文件也在不停的增大,这里介绍几种方法减小这个文件的方法. 1.直接删除log文件(一般不建议) 分离数据库.分离数据库之前一定要做好数据库的全备份,选择数据库——右键——任 ...
- Sql Server数据库之约束
一.约束的分类 实体约束:关于行的约束,比如某一行出现的值就不允许别的行出现,如主键 域约束:关于列的约束,对表中所有行的某些列进行约束,如check约束 参照完整性约束:如果某列的值必须与其他列的值 ...
- Python(数据库之约束表的关系)
一.约束 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性 主要分为: RIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...
随机推荐
- 8)django-示例(url传递参数)
url传递参数有两种,一个是通过普通分组方式,一个是通过带命名分组方式 1.传递方式 1)普通分组方式,传递参数顺序是严格的.如下例子 url(r'^detail-(\d+)-(\d+).html', ...
- 彻底搞懂字符集编码:ASCII,Unicode 和 UTF-8
一.ASCII 码 我们知道,计算机内部,所有信息最终都是一个二进制值.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个 ...
- liunx 安装 mysql 5.6
第一步 解压文件 目录切换到/usr/local/ cd /usr/local/ 解压 tar zxvf mysql-5.6.33-linux-glibc2.5-x86_64.tar.gz 重命名为 ...
- FileStorage
1. 函数说明 功能 函数声明 参数 FileStorage构造函数 cv::FileStorage:: FileStorage(const String& ...
- Confluence 6 已经存在的安装配置数据库字符集编码
针对已经存在的 Confluence 安装,如果你安装的 Confluence 版本是 6.4 或者早期的版本,我们在安装的时候没有检查你数据库的字符设置. 如果你的数据库当前没有被配置使用 UTF- ...
- json的转换操作
toJSON 把JS对象{ 'x': 2, 'y': 3 }转为JSON对象格式的字符串 不能转化字符串 比如"{ 'x': 2, 'y': 3 }" 可以转格式不标准的jso ...
- Django框架第一篇基础
一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负 ...
- 【python】声明编码的格式
来自:http://www.xuebuyuan.com/975181.html 编码声明必须在第一行或者第二行,且要符合正则表达式 "coding[:=]\s*([-\w.]+)" ...
- laravel 实现一个简单的 RESTful API
创建一个 Article 资源 php artisan make:resource Article 你可以在 app/Http/Resources 目录下看到你刚刚生成的 Article 资源 当然我 ...
- PDF文件编辑技巧之PDF书签怎么设置
纸质的文件想要添加书签就直接拿笔书写就可以,Word文件怎么添加书签相信大家也都知道,那么PDF文件的书签要怎么设置的呢,是不是有很多小伙伴不知道该怎么做呢,不要担心,今天小编就来跟大家分享一下在PD ...