首页 > 编程语言 >python入门基础之主键、外键、约束条件

python入门基础之主键、外键、约束条件

时间:2022-11-24 20:27:16浏览次数:35  
标签:name python 外键 id int key mysql 主键

python入门基础之主键、外键、约束条件

目录

字段约束条件

约束是一种限制,通过对表中的数据做出限制,来确保表中数据完整性、唯一性。
1.unsigned
	无需正负号
    eg:id int unsigned
2.zerofill
	在插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
    eg:id int(5) zerofill
3.not null
	不能为空(非空)
    eg:name varchar(32)not null
    注意:空字符串不等于null
4.default
	默认值
    插入数据值时,如果没有明确为字段赋值,则自动赋予默认值,在没有默认值的情况下,默认为null

mysql> create table t1(id int, name varchar(32)default 'jason');
Query OK, 0 rows affected (0.65 sec)

mysql> insert into t1(id)values(1);
Query OK, 1 row affected (0.09 sec)

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | jason |
+------+-------+
1 row in set (0.00 sec)

5.unique
	唯一值
    限制一个字段的值不重复,该字段的数据不能出现重复。确保字段中的值唯一
    eg:id int unique 单列唯一
    eg:unique(字段名,字段名) 联合唯一
    
mysql> create table t2(id int unique,name varchar(32) default 'jason');
Query OK, 0 rows affected (0.34 sec)

mysql> insert into t2(id) values(1);
Query OK, 1 row affected (0.12 sec)

mysql> insert into t2(id) values(1);
ERROR 1062 (23000): Duplicate entry '1' for key 'id'
mysql> insert into t2(id) values(2);
Query OK, 1 row affected (0.12 sec)
    

主键

关键字:primary key

定义:
	主键(primary)的完整称呼是“主键约束”。MySQL主键约束是一个列或者列的组合,其值能唯一的标识表中的每一行。这样的一列或多列称为表的主键,通过它可以强制表的实体完整性。

强调:
	在关系数据库,一个表中只能有一个主键,有些数据库没有主键,系统报错。在MySQL数据库中,建立表时,可以有主键,也可以没有(推荐建立表时必须要有主键)。

#单从约束角度上而言,主键等价于非空且唯一 not null unique
mysql> create table t3(id int primary key,name varchar(32) default'jason');
Query OK, 0 rows affected (0.59 sec)

mysql> insert into t3(name)values('jason');
ERROR 1364 (HY000): Field 'id' doesn't have a default value
mysql> insert into t3(id,name)values(1,'jason');
Query OK, 1 row affected (0.12 sec)

mysql> insert into t3(id,name)values(1,'jason');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into t3(id,name) values(2,'kevin');
Query OK, 1 row affected (0.37 sec)

mysql> select * from t3;
+----+-------+
| id | name  |
+----+-------+
|  1 | jason |
|  2 | kevin |
+----+-------+
2 rows in set (0.00 sec)

#InnoDB存储引擎规定了所有的表都必须有且只有一个主键(主键是组织数据的重要条件并且主键可以加快数据的查询速度)
1.当表中没有主键也没有其他非空且唯一的字段的情况下
	InnoDB会采用一个隐藏的字段作为表的主键,隐藏意味着无法使用,基于该表的数据查询只能一行行查找,速度很慢。
2.当表中没有主键但是有其他非空且唯一的字段,那么会从上往下将第一个该字段自动升级为主键
mysql> create table t4(id int,age int not null unique,phone bigint not null unique,brith int not null unique,
    -> height int not null unique);
Query OK, 0 rows affected (0.71 sec)
"""
我们在创建表的时候应该有一个字段作为主键用来标识数据的唯一性,并且该字段通常情况下就是'id'(编号)字段
	id nid sid pid gid uid
create table userinfo(uid int primary key,);
"""
#联合主键(多个字段组合 本质还是一个主键)
mysql> create table t5(id int,name varchar(32),pwd int,primary key(id,pwd));
Query OK, 0 rows affected (0.59 sec)

自增

关键字:auto_increment
该约束条件不能单独出现,并且一张表中只能出现一次,主要配合主键一起用。
mysql> create table t8(id int primary key,name varchar(32));
Query OK, 0 rows affected (0.60 sec)

mysql> create table t9(id int primary key auto_increment,name varchar(32));
Query OK, 0 rows affected (0.56 sec)
"""
自增特性:
	自增不会因为数据的删除而回退,永远自增向前
	如果自己设置了更大的数,则之后按照更大的数往前自增
	如果想重置某张表的主键值,可使用turncate t9;清空表数据并重置主键
	#格式化表
"""

优点:
	1.数据库自动编号,速度快且是增量增长。按顺序存放对于检索非常有利;
    2.数字型,占用空间小,易排序,在程序中传递也方便;
    3.如果通过非系统增加记录时,可以不用指定该字段,不用担心主键重复问题。

外键前戏

定义:
	外键约束即数据库中两个数据表之间的某个列建立的一种联系
作用:
	MySQL通过外键约束的引入,可以使得数据表中的数据完整性更强;保证数据的一致性。
"""
ps:
	与外键关联的主表的字段必须设置为主键;
	要求从表不能是临时表,主从表的字段具备相同的数据类型、字符长度和约束
"""
外键字段:用于标识数据与数据之间关系的字段

关系的判断

表关系、数据关系其实意思是一样的,只是说法上有区分
关系一共四种:
	一对多、多对多、一对一、没有关系
    关系的判断可以采用‘换位思考’原则

一对多关系
以员工表和部门表为例
	1.先站在员工表的角度
    	问:一名员工能否对应多个部门
       答:不可以
 	2.再站在部门表的角度
    	问:一个部门能否对应多名员工
     	答:可以	
	结论:一个可以一个不可以 那么关系就是'一对多'
	针对'一对多'关系 外键字段建在'多'的一方

外键字段的建立

小技巧:先定义出含有普通字段的表,之后再考虑外键字段的添加
create table emp(
	id int primary key auto_increment,
 	name varchar(32),
 	age int,
 	dep_id int,
	foreign key(dep_id) references dep(id)
);

create table dep(
	id int primary key auto_increment,
 	dep_name varchar(32),
  	dep_desc varchar(64)
);
1.创建表的时候一定要先创建被关联表
2.录入表数据的时候一定要先录入被关联表
3.修改数据的时候外键字段无法修改和删除

针对3有简化措施>>>:级联更新级联删除
create table emp1(
	 id int primary key auto_increment,
 	 name varchar(32),
 	 age int,
 	 dep_id int,
	 foreign key(dep_id) references dep1(id) 
    on update cascade 
    on delete cascade
);

create table dep1(
	id int primary key auto_increment,
 	dep_name varchar(32),
  	dep_desc varchar(64)
);

"""
外键其实是强耦合 不符合解耦合的特性
	所以很多时候 实际项目中当表较多的情况 我们可能不会使用外键 而是使用代码建立逻辑层面的关系
"""

多对多关系

以书籍表与作者表为例
	1.先站在书籍表的角度
  		问:一本书能否对应多个作者
      答:可以
 	2.再站在作者表的角度
    	问:一个作者能否对应多本书
      	答:可以
   结论:两个都可以 关系就是'多对多'	
 	针对'多对多'不能在表中直接创建 需要新建第三张关系表
 
create table book(
	id int primary key auto_increment,
 	title varchar(32),
  	price float(5,2)
);
create table author(
	id int primary key auto_increment,
 	name varchar(32),
  	phone bigint
);
create table book2author(
	id int primary key auto_increment,
   author_id int,
 	foreign key(author_id) references author(id)
  	on update cascade
  	on delete cascade,
   book_id int,
  	foreign key(book_id) references book(id)
  	on update cascade
  	on delete cascade
);
mysql> desc book2author;
+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| id        | int(11) | NO   | PRI | NULL    | auto_increment |
| author_id | int(11) | YES  | MUL | NULL    |                |
| book_id   | int(11) | YES  | MUL | NULL    |                |
+-----------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> desc author;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(32) | YES  |     | NULL    |                |
| phone | bigint(20)  | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)

mysql> desc book;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| title | varchar(32) | YES  |     | NULL    |                |
| price | float(5,2)  | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)


一对一关系

以用户表与用户详情表为例
	1.先站在用户表的角度
  		问:一个用户能否对应多个用户详情
      答:不可以
 	2.再站在用户详情表的角度
    	问:一个用户详情能否对应多个用户
      	答:不可以
   结论:两个都可以 关系就是'一对一'或者没有关系	
 	针对'一对一'外键字段建在任何一方都可以 但是推荐建在查询频率较高的表中
 
create table user(
	id int primary key auto_increment,
  	name varchar(32),
 	detail_id int unique,
  	foreign key(detail_id) references userdetail(id)
  	on update cascade
  	on delete cascade
);

create table userdetail(
	id int primary key auto_increment,
  	phone bigint
);

mysql> desc user;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | int(11)     | NO   | PRI | NULL    | auto_increment |
| name      | varchar(32) | YES  |     | NULL    |                |
| detail_id | int(11)     | YES  | UNI | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

mysql> desc userdetail;
+-------+------------+------+-----+---------+----------------+
| Field | Type       | Null | Key | Default | Extra          |
+-------+------------+------+-----+---------+----------------+
| id    | int(11)    | NO   | PRI | NULL    | auto_increment |
| phone | bigint(20) | YES  |     | NULL    |                |
+-------+------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)

标签:name,python,外键,id,int,key,mysql,主键
From: https://www.cnblogs.com/zhiliaowang/p/16923094.html

相关文章

  • 【Python】第4章-11 判断素数
    判断一个给定的正整数是否素数输入格式:输入在第一行给出一个正整数N(≤10),随后N行,每行给出一个小于1000000的需要判断的正整数输出格式:对每个需要判断的正整数,如果它......
  • 【Python】第4章-10 最大公约数和最小公倍数
    本题要求两个给定正整数的最大公约数和最小公倍数。输入格式:输入在一行中给出两个正整数M和N(≤1000)。输出格式:在一行中顺序输出M和N的最大公约数和最小公倍数,两数字......
  • Mysql:字段约束条件:无符号、零填充、非空、默认值、唯一值、主键、自增、外键前戏、
    目录无符号、零填充非空默认值唯一值主键自增外键前戏关系的判断一对多关系外键字段的建立多对多关系一对一关系无符号、零填充'''关键字unsigned无需正负号'''crea......
  • python环境安装
    1、windows环境下python的下载​​https://www.python.org/downloads/release/python-391/​​2、点击默认安装,安装完成后配置环境变量;......
  • Python的魔法函数
    1.什么是魔法函数Python的类中有很多内置的魔法函数,他们以__开始和结束,如__init__,__str__等等,它是未来增强类的特性,不需要专门调用,在特定的场合下Python会自己调用,......
  • python,requests高级用法,爬虫代理池,BautifulSoup4介绍
    requests高级用法ssl认证使用代理超时设置异常处理上传文件代理池搭建django后端获取客户端的ip爬取某视频网站爬取新闻BautifulSoup......
  • ubuntu22 安装python3-dev
    使用apt安装python-dev时报错,更换软件源无法解决。首先确定python版本(大版本号,我的是3),然后使用python3-dev代替python-dev。 使用aptitude解决问题:1.安装aptitudesu......
  • 麒麟桌面系统自动化方案 pyautogui+pythonnet
    麒麟系统模拟鼠标的点击、滑动等操作,键盘输入等操作pyautogui的安装见上篇文章可以通过pythonnet封装python脚本,实现点击和输入等操作做到自动化鼠标移动void......
  • mybatisplus-plus实现多主键批量保存或更新
    一、依赖<dependencies>......//其他依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boo......
  • python项目2--【数据可视化】之下载数据
    目录python项目2--【数据可视化】之下载数据一、CSV文件格式1.分析CSV文件头2.打印文件头及其位置3.提取并读取数据4.绘制温度图表5.编辑中python项目2--【数据可视......