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