python 之 数据库(字段的约束条件,表之间的关系)
10.6 约束条件
10.61 not null 、default
create table t15(
id int,
name char(16) not null,
sex enum('male','female','other') not null default "male"
);
#alter table t15 modify name char(16) not null;
insert into t15(id,name) values
(1,'egon1'),
(2,'egon2'),
(3,'egon3');
mysql> desc t15;
+-------+-------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(16) | NO | | NULL | |
| sex | enum('male','female','other') | NO | | male | |
+-------+-------------------------------+------+-----+---------+-------+
mysql> select * from t15;
+------+-------+------+
| id | name | sex |
+------+-------+------+
| 1 | egon1 | male |
| 2 | egon2 | male |
| 3 | egon3 | male |
+------+-------+------+
10.62 unique
mysql中存在一种专门的数据结构,叫 key,又称为索引,通过该数据结构可以减少 i/o 次数,从而加速查询效率 index key : 只有加速查询的效果,没有约束的功能 unique key:不仅有加速查询的效果,还附加了一种约束的功能 primary key:不仅有加速查询的效果,还附加了一种约束的功能,并且innodb存储引擎会按照主键字段的值 来组织表中所有的数据,所以一种inndob表中必须有、而且只能有一个主键,通常为该表的id字段
unique:限制字段的值的唯一性,单从约束角度去看:唯一性约束
#单列唯一
create table t16(
id int unique,
name char(16)
);
# 联合唯一(不能完全相同)
create table server(
id int unique,
ip char(15),
port int,
unique(ip,port)
);
mysql> desc server;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | YES | UNI | NULL | |
| ip | char(15) | YES | MUL | NULL | |
| port | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
insert into server values(1,'1.1.1.1',3306),(2,'1.1.1.1',3307),(3,'1.1.1.2',3306);
mysql> select * from server;
+------+---------+------+
| id | ip | port |
+------+---------+------+
| 1 | 1.1.1.1 | 3306 |
| 2 | 1.1.1.1 | 3307 |
| 3 | 1.1.1.2 | 3306 |
+------+---------+------+
10.63 primary key
primary key:单单从约束角度去看,primary key就等同于 not null + unique 强调: 1、一张表中必须有,并且只能有一个主键 2、一张表中都应该有一个id字段,而且应该把id字段做成主键
create table t17(
id int primary key,
name char(16),
age int,
sex char(6)
)engine=innodb;
#联合主键(不完全相同,但不能为空)
create table t19(
ip char(15),
port int,
primary key(ip,port)
);
mysql> desc t19;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| ip | char(15) | NO | PRI | | |
| port | int(11) | NO | PRI | 0 | |
+-------+----------+------+-----+---------+-------+
10.64 auto_increment
只能给被约束成key的字段加自增属性,默认起始位置是1,步长也为1
# primary key auto_increment
create table t20(
id int primary key auto_increment,
name char(16)
)engine=innodb;
mysql> insert t20(name) values('egon1');
mysql> insert t20(name) values('egon2');
mysql> select * from t20;
+----+-------+
| id | name |
+----+-------+
| 1 | egon1 |
| 2 | egon2 |
+----+-------+
10.7 表关系
10.71 多对一(foreign key)
1、把所有数据都存放于一张表的弊端:
表的组织结构复杂不清晰
浪费空间
扩展性极差
2、寻找表与表之间的关系的方法: 举例:emp表 dep表 步骤一: part1: 1、先站在左表emp的角度 2、去找左表emp的多条记录能否对应右表dep的一条记录
part2: 1、站在右表dep的角度 2、去找右表dep的多条记录能否对应左表emp的一条记录 3、如何实现? 在emp表中新增一个dep_id字段,该字段指向dep表的id字段
4、foreign key会带来什么样的效果?
约束1:在创建表时,先建被关联的表dep,才能建关联表emp
create table dep(
id int primary key auto_increment,
dep_name char(10),
dep_comment char(60)
);
mysql> desc dep;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| dep_name | char(10) | YES | | NULL | |
| dep_comment | char(60) | YES | | NULL | |
+-------------+----------+------+-----+---------+----------------+
create table emp(
id int primary key auto_increment,
name char(16),
gender enum('male','female') not null default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
);
mysql> desc emp;
+--------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(16) | YES | | NULL | |
| gender | enum('male','female') | NO | | male | |
| dep_id | int(11) | YES | MUL | NULL | |
+--------+-----------------------+------+-----+---------+----------------+
约束2:在插入记录时,必须先插被关联的表dep,才能插关联表emp
insert into dep(dep_name,dep_comment) values
('sb教学部','sb辅导学生学习,教授python课程'),
('外交部','形象大使'),
('nb技术部','nb技术能力有限部门');
mysql> select * from dep;
+----+-------------+-------------------------------------------+
| id | dep_name | dep_comment |
+----+-------------+-------------------------------------------+
| 1 | sb教学部 | sb辅导学生学习,教授python课程 |
| 2 | 外交部 | 形象大使 |
| 3 | nb技术部 | nb技术能力有限部门 |
+----+-------------+-------------------------------------------+
insert into emp(name,gender,dep_id) values
('alex','male',1),
('egon','male',2),
('lxx','male',1),
('wxx','male',1),
('wenzhou','female',3);
mysql> select * from emp;
+----+---------+--------+--------+
| id | name | gender | dep_id |
+----+---------+--------+--------+
| 1 | alex | male | 1 |
| 2 | egon | male | 2 |
| 3 | lxx | male | 1 |
| 4 | wxx | male | 1 |
| 5 | wenzhou | female | 3 |
+----+---------+--------+--------+
约束3:更新与删除都需要考虑到关联与被关联的关系(不能直接改变dep表的id) 解决方案:
1、先删除关联表emp,再删除被关联表dep,准备重建
mysql> drop table emp;
mysql> drop table dep;
2、重建:新增功能:同步更新,同步删除
create table dep( #先建被参照的表
id int primary key auto_increment,
dep_name char(10),
dep_comment char(60));
create table emp(
id int primary key auto_increment,
name char(16),
gender enum('male','female') not null default 'male',
dep_id int,
foreign key(dep_id) references dep(id) on update cascade on delete cascade);
insert into dep(dep_name,dep_comment) values
('sb教学部','sb辅导学生学习,教授python课程'),
('外交部','形象大使'),
('nb技术部','nb技术能力有限部门');
mysql> select * from dep;
+----+------------------+------------------------------
| id | dep_name | dep_comment |
+----+------------------+------------------------------
| 1 | sb教学部 | sb辅导学生学习,教授python课程 |
| 2 | 外交部 | 形象大使 |
| 3 | nb技术部 | nb技术能力有限部门 |
+----+------------------+-------------------------------
insert into emp(name,gender,dep_id) values
('alex','male',1),
('egon','male',2),
('lxx','male',1),
('wxx','male',1),
('wenzhou','female',3);
mysql> select * from emp;
+----+------------------+--------+--------+
| id | name | gender | dep_id |
+----+------------------+--------+--------+
| 1 | alex | male | 1 |
| 2 | egon | male | 2 |
| 3 | lxx | male | 1 |
| 4 | wxx | male | 1 |
| 5 | wenzhou | female | 3 |
+----+------------------+--------+--------+
# 同步删除
mysql> delete from dep where id=1;
mysql> select * from dep;
+----+------------------+------------------
| id | dep_name | dep_comment |
+----+------------------+------------------
| 2 | 外交部 | 形象大使 |
| 3 | nb技术部 | nb技术能力有限部门 |
+----+------------------+------------------
mysql> select * from emp;
+----+------------------+--------+--------+
| id | name | gender | dep_id |
+----+------------------+--------+--------+
| 2 | egon | male | 2 |
| 5 | wenzhou | female | 3 |
+----+------------------+--------+--------+
#同步更新
mysql> update dep set id=200 where id =2;
mysql> select * from dep;
+-----+------------------+----------------
| id | dep_name | dep_comment |
+-----+------------------+----------------
| 3 | nb技术部 | nb技术能力有限部|
| 200 | 外交部 | 形象大使 |
+-----+------------------+----------------
mysql> select * from emp;
+----+------------------+--------+--------+
| id | name | gender | dep_id |
+----+------------------+--------+--------+
| 2 | egon | male | 200 |
| 5 | wenzhou | female | 3 |
+----+------------------+--------+--------+
10.72 多对多(foreign key)
1、什么是多对多 两张表之间是一个双向的多对一关系,称之为多对多 2、如何实现? 建立第三张表,该表中有一个字段是fk左表的id,还有一个字段是fk右表的id
create table author(
id int primary key auto_increment,
name char(16));
create table book(
id int primary key auto_increment,
bname char(16),
price int);
insert into author(name) values
('egon'),
('alex'),
('wxx');
mysql> select * from author;
+----+------+
| id | name |
+----+------+
| 1 | egon |
| 2 | alex |
| 3 | wxx |
+----+------+
insert into book(bname,price) values
('python从入门到入土',200),
('葵花宝典切割到精通',800),
('九阴真经',500),
('九阳神功',100);
mysql> select * from book;
+----+-----------------------------+-------+
| id | bname | price |
+----+-----------------------------+-------+
| 1 | python从入门到入土 | 200 |
| 2 | 葵花宝典切割到精通 | 800 |
| 3 | 九阴真经 | 500 |
| 4 | 九阳神功 | 100 |
+----+-----------------------------+-------+
create table author2book(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id) on update cascade on delete cascade,
foreign key(book_id) references book(id) on update cascade on delete cascade);
insert into author2book(author_id,book_id) values
(1,3),(1,4),(2,2),(2,4),(3,1),(3,2),(3,3),(3,4);
mysql> select * from author2book;
+----+-----------+---------+
| id | author_id | book_id |
+----+-----------+---------+
| 1 | 1 | 3 |
| 2 | 1 | 4 |
| 3 | 2 | 2 |
| 4 | 2 | 4 |
| 5 | 3 | 1 |
| 6 | 3 | 2 |
| 7 | 3 | 3 |
| 8 | 3 | 4 |
+----+-----------+---------+
10.73 一对一(unique+foreign key)
一对一:左表的一条记录唯一对应右表的一条记录,反之也一样 create table customer( #先建被参照的表
id int primary key auto_increment,
name char(20) not null,
qq char(10) not null,
phone char(16) not null);
create table student(
id int primary key auto_increment,
class_name char(20) not null,
customer_id int unique, #该字段一定要是唯一的,一对一
foreign key(customer_id) references customer(id) #外键的字段一定要保证unique
on delete cascade on update cascade);
insert into customer(name,qq,phone) values
('李飞机','',13811341220),
('王大炮','',15213146809),
('守榴弹','',1867141331),
('吴坦克','',1851143312),
('赢火箭','',1861243314),
('战地雷','',18811431230);
mysql> select * from customer;
+----+-----------+-----------+-------------+
| id | name | qq | phone |
+----+-----------+-----------+-------------+
| 1 | 李飞机 | 31811231 | 13811341220 |
| 2 | 王大炮 | 123123123 | 15213146809 |
| 3 | 守榴弹 | 283818181 | 1867141331 |
| 4 | 吴坦克 | 283818181 | 1851143312 |
| 5 | 赢火箭 | 888818181 | 1861243314 |
| 6 | 战地雷 | 112312312 | 18811431230 |
+----+-----------+-----------+-------------+
insert into student(class_name,customer_id) values
('python',3),('java',4),('c++',5);
mysql> select * from student;
+----+-------------+-------------+
| id | class_name | customer_id |
+----+-------------+-------------+
| 1 | python | 3 |
| 2 | java | 4 |
| 3 | c++ | 5 |
+----+-------------+-------------+
python 之 数据库(字段的约束条件,表之间的关系)的更多相关文章
- wordpress数据库结构以及数据表之间的关系
默认WordPress一共有以下11个表.这里加上了默认的表前缀 wp_ . wp_commentmeta:存储评论的元数据 wp_comments:存储评论 wp_links:存储友情链接(Blog ...
- MySQL数据库:SQL语句基础、库操作、表操作、数据类型、约束条件、表之间的关系
数据库相关概念: 1. 数据库服务器:运行数据库管理软件的计算机 2. 数据库管理软件:MySQL.Oracle.db2.slqserver 3. 库:文件夹,用来组织文件/表 4. 表:文件(类似于 ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- 基础概念:Oracle数据库、实例、用户、表空间、表之间的关系
基础概念:Oracle数据库.实例.用户.表空间.表之间的关系 数据库: Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实Oracle数据库 ...
- sql操作数据库(3)-->外键约束、数据库表之间的关系、三大范式、多表查询、事务
外键约束 在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名) 在已有表中添加外键约束:alter t ...
- MySQL表与表之间的关系详解
外键 说到表与表之间的关系就不得不说到一个关键词:外键 MySQ中的外键是什么,和表与表之间有什么关联? 外键(foreign key)又叫外连接, 在数据库中发挥着重要的作用 尤其是对于表和表之间的 ...
- MySQL 表之间的关系
表之间的关系 # 定义一张部门员工表 emp id name gander dep_name dep_desc 1 ming male 教学部 教书 2 lilei male 教学部 教书 3 ham ...
- mysql中相关,无关子查询,表与表之间的关系以及编码和乱码的解决
※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样)SHOW VARIABLES; //查看系统变量//查询字符编码相关的系统变量SHOW VARIABLES WHERE var ...
- MySQL表与表之间的关系
表与表之间的关系 表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以 ...
随机推荐
- ManualResetEven使用的最清楚说明
ManualResetEven使用的最清楚说明 快速阅读 理解ManualResetEvent,以及如何使用. 官方说明 官方介绍:https://docs.microsoft.com/en-us/d ...
- T-MAX组--项目冲刺(第四天)
THE FOURTH DAY 项目相关 作业相关 具体描述 所属班级 2019秋福大软件工程实践Z班 作业要求 团队作业第五次-项目冲刺 作业正文 T-MAX组--项目冲刺(第四天) 团队名称 T-M ...
- sourceinsight4 用设置
通用设置Options - File Type Options: 显示行号:勾选Show line mumbers选中自动高亮:勾选Hightlight references to selected ...
- PyCharm 中写 Turtle代码没提示以及标黄问题
PyCharm 中在使用Turtle(海龟)库绘图体系时,代码明明是正确可以运行的,但是没有提示 ,代码出现黄色标记以及红色波浪线 ,经验不足的人还以为自己的书写方法错误,毕竟出现了红色波浪线,效果如 ...
- locust性能测试脚本模板
locust性能测试脚本模板 #!/usr/bin/env python # -*- coding: utf-8 -*- import time from locust import HttpLocu ...
- 替换分隔符 ^p, 或者是回车
1 Excel 里面的数据, 粘出来到notepad上,再从notepad 粘到word, 再把world里面的分隔符或者是回车符替换成 其他的 .
- Java 读取clob字段的几种方法
Java 读取clob字段的几种方法 一.第一种 Clob clob = rs.getClob("remark");//Java.sql.Clob String detailinf ...
- java类型 jdbcType类型 mysql类型关系
java类型 jdbcType类型 mysql类型关系 Java类型 JdbcType Mysql类型 备注 String VARCHAR VARCHAR 变长字符串 String LONGVARCH ...
- 真正的能理解CSS中的line-height,height与line-height
https://blog.csdn.net/a2013126370/article/details/82786681 在最近的项目中,常常用到line-height,只是简单的理解为行高但并没有深层次 ...
- RabbitMQ 入门教程(PHP版) 第四部分:路由(Routing)
路由(Routing) 在前面的第三部分教程中,我们实现了一个简单的日志系统.可以把日志消息广播给多个接收者. 本篇教程中我们打算新增一个功能——使得它能够只订阅消息的一个字集.例如,我们只需要把严重 ...