外键

项目中是否需要使用外键

左心房为你撑大大i 提交于 2019-12-04 15:56:47
是否使用外键确实会有一些争议。关于外键的使用: 首先,外键本身是为了实现强一致性,所以如果需要正确性>性能的话,还是建议使用外键,它可以让我们在数据库的层面保证数据的完整性和一致性。 当然不用外键,你也可以在业务层进行实现。不过,这样做也同样存在一定的风险,因为这样,就会让业务逻辑会与数据具备一定的耦合性。也就是业务逻辑和数据必须同时修改。而且在工作中,业务层可能会经常发生变化。 当然,很多互联网的公司,尤其是超大型的数据应用场景,大量的插入,更新和删除在外键的约束下会降低性能,同时数据库在水平拆分和分库的情况下,数据库端也做不到执行外键约束。另外,在高并发的情况下,外键的存在也会造成额外的开销。因为每次更新数据,都需要检查另外一张表的数据,也容易造成死锁。 所以在这种情况下,尤其是大型项目中后期,可以采用业务层来实现,取消外键提高效率。 不过在SQL学习之初,包括在系统最初设计的时候,还是建议你采用规范的数据库设计,也就是采用外键来对数据表进行约束。因为这样可以建立一个强一致性,可靠性高的数据库结构,也不需要在业务层来实现过多的检查。 当然在项目后期,业务量增大的情况下,你需要更多考虑到数据库性能问题,可以取消外键的约束,转移到业务层来实现。而且在大型互联网项目中,考虑到分库分表的情况,也会降低外键的使用。 不过在SQL学习,以及项目早期,还是建议你使用外键。在项目后期

数据完整性

核能气质少年 提交于 2019-12-04 15:23:27
数据完整性 1、域完整性:字段/列------非空、缺省 2、实体完整性:记录/行------主键、唯一键 3、引用完整性:表与表之间------外键 MySQL中的约束:主键(primary key)、唯一性(unique)、非空(not null)、缺省(default)、外键(foreign key) 主键、唯一键、外键都会自动创建索引 一个表只能有一个或一组主键 唯一键:候选主键,区别在于其可以存储空值 外键:来源于主表的主键或者唯一键(外键对应字段:可允许为空,且其值须在外表中出现) 外键 在字段最后添加 constraint fk_Elogs_sID foreign key(sID) references Students(sNo) constraint 约束名 约束类型(对应字段) references 主键(主键字段或位移键字段) 主键 primary key (sid,sCard) 外键 在字段最后添加 constraint fk_Elogs_sID foreign key(sID) references Students(sNo) constraint 约束名 约束类型(对应字段) references 主键(主键字段或位移键字段) 主键 primary key (sid,sCard) 例子: 对于已经存在的表添加唯一键约束 alter table S add

django-ORM外键删除操作详解

只谈情不闲聊 提交于 2019-12-04 14:20:30
前提是创建好了 ORM框架 这里沿用 https://www.cnblogs.com/ifdashui/p/11863546.html 该创建外键的例子基础上做学习记录 1.关于级联的外键删除 也就是使用 on_delete=models.CASCADE 来创建的外键 在包下的views.py中做删除 然后在映射 使用include做一个总的映射 运行django输入映射的地址,就删除这个外键了 2. 受保护的外键无法删除 on_delete=models.PROTECT 如果这个外键在后期维护中是不需要删除的就设置成这个 3. SET_NULL :外键被删除 那么本数据的字段的设置就为空,如果要设置这个选项,那么这个字段是需要设置为空的 4.models.SET_DEFAULT: 默认值,也就是外键删除某条数据后,使用你设置的数据作为默认值 设置了默认值为外键的第二条数据(pk=2) 那么在删除第一条数据了后(pk=1),就会将外键的第二条数据默认赋值给之前被删除的数据 后面的具体参考 https://blog.csdn.net/luzon1/article/details/87816674 这篇文章 来源: https://www.cnblogs.com/ifdashui/p/11869949.html

MySQL之外键、主键、自增

99封情书 提交于 2019-12-04 14:03:47
1、创建外键 create table userinfo(   uid int auto_increment primary key,   name varchar(32),   department_id int,   xx_id int,   constraint fk_user_depar foreign key (“department_id”) references color(“id”) )engine=innodb default charset=utf8; create table department(      id bigint auto_increment primary key,      title char(15) )engine=innodb default charset=utf8; View Code 2、补充主键:   一个表只能有一个主键   主键可以由多列组成: create table t1( nid int(11) not null auto_increment, pid int(11) not null , num int(11) null, primary key(nid,pid) ) engine=InnoDB default charset=utf8; View Code 例: CREATE TABLE t5 (   nid

2.MySQL(二)

冷暖自知 提交于 2019-12-04 13:23:46
数据之表操作 1.创建表 语法:CREATE TABLE table_name (column_name column_type); create table student( -> id INT NOT NULL AUTO_INCREMENT, -> name CHAR(32) NOT NULL, -> age INT NOT NULL, -> regiiter_date DATE, -> PRIMARY KEY(id) -> ); auto_increment 表示:自增1。写入内容为空时,默认从1,2,3...往下填充写入表格中。primary key: 表示约束(不能重复且不能为空); 加速查找not null: 不为空查看表show tables; -->查看有哪些表desc student; --> 查看student表的信息show create table student; -->查看表student创建的信息 2.删除表 #drop table 表名 drop table student; 3.修改表 添加列:alter table 表名 add 列名 类型 删除列:alter table 表名 drop column 列名 修改列: alter table 表名 modify column 列名 类型; -- 类型 alter table 表名 change

ORM外键使用详解

旧城冷巷雨未停 提交于 2019-12-04 13:06:56
前提是创建好了一个ORM框架 在cmd中(有虚拟环境的需要进入虚拟环境以及该项目的路径)使用 python manage.py makemigrations 和 python manage.py migrate 迁移脚本并且映射到数据库 使用nacicat打开这个数据库 就可以看到关联了category了,也就是这个category_id也就是这个category表中对应的数据了 使用这个外键小练手: 1.在包下的views.py中写上相应的视图函数 2.在该包下新建一个urls.py,映射视图函数 3.在总项目的urls.py中使用include做一个总映射即可 4.接下来运行这个django项目 目前是看不到效果的,想看到 Article 关联 Category 的数据的话, 正常在views.py中使用ORM的增删改差中的查来具体查询数据 (  article = Article.objects.first()  print(article.category.name) ) 在重新运行django即可 PS:上面的例子外键关联是在同在同一个app(book)下的如果要引用另外一个app的呢 先创建一个新的app包 创建一个简单的ORM模型 在settings.py中配置这个包 接着在cmd(有虚拟环境的进入虚拟环境,并且路径是该项目的路径)中生成迁移脚本文件并且映射到数据库

MySQL之数据表控制语句

巧了我就是萌 提交于 2019-12-04 11:28:11
博文大纲: 一、约束条件相关语句 主键约束 非空约束 设置值的唯一性 设置列的默认值 设置自增值 二、ALTER指令的使用 修改列值的数据长度 修改字段名 向表中插入一个新的字段 添加字段时添加约束 添加一个外键 删除外键 删除列 修改列的顺序 删除表 一、约束条件相关语句 1、主键约束(主键约束要求主键列的数据唯一,并且不允许为空) #创建库 mysql> create database test01; #切换至新库 mysql> use test01; #创建一个带有主键约束的表 mysql> create table t1( -> id int(10), -> name varchar(10) primary key, -> sex varchar(5), -> info varchar(200) -> ); 确定创建的是否为主键(该列是否有PRI字样): 上述方法,是在定义列的同时定义主键,下面来写一下定义完所有列之后指定主键: mysql> create table t2( -> id int(10), -> name varchar(10), -> sex varchar(5), -> primary key(id) -> ); 确认是否有主键: 2、非空约束(不允许列的值为空) mysql> create table t3( -> id int(6) not null

mysql术语

ε祈祈猫儿з 提交于 2019-12-04 07:08:42
主键是定义一个表中起主要作用的数据项,这些数据项的数据在表中是唯一的,同时系统按主键为表建立索引。 外键是定义一个表中的某数据项的数据,要参照另一个表的主键数据。既没有在另一个表的主键数据中出现的数据,不允许在这个表的外键数据项中出现。 键是一个或多个字段的组合 主键:表中记录的唯一标识 外键:依赖于别的表的数据 唯一键:在表中唯一,可以确定一条记录的字段(或字段组合),一张表可以有多个唯一键,正如可以识别你的身份的可以是身份证,学生证,军人证 主键:你把唯一键的一个选做主键,一张表只能有一个主键 外键:所定义的外键是另一张表的主键, 主键:表中记录的唯一标识,外键:依赖于别的表的数据,唯一键:在表中唯一。 主键和唯一键的一个区别:主键是不允许为NULL的,唯一键则可以,当然你可以加上NOT NULL来限制它 主键:能够唯一表示数据表中的每个记录的字段或者字段的组合就称为主键。一个主键是唯一识别一个表的每一行记录,但这只是其作用的一疗分,主键的主要作用是将记录和存放在其他表中的数据进行关联,在这一点上,主键是不同表中各记录间的简单指针,主键约整就是确定表中的每一条记录,主键不能是空值,唯一约束是用于指定一个或多个列的组合值具有唯一性,以防止在列中输入重复的 来源: https://www.cnblogs.com/wang-mengmeng/p/11845858.html

python-django框架-orm相关继续&ORM的增删改查操作_20191110

感情迁移 提交于 2019-12-04 05:33:28
python-django框架-orm相关继续 orm不常用字段: 1,BigIntegerField(IntegerField):可以存手机号,也可以使用字符串存储手机号, - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 2,BooleanField(Field) - 布尔值类型 3,DateTimeField(DateField) - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 4,时间间隔 DurationField(Field) - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 import datetime now = datetime.datetime.now() #场景:领了一个7天的优惠券,求截止时间是多少??? #这个时候就用到了时间间隔,、 d= datetime.timedelta(days=7) print(now+d) print(now) ---------------------------------------- 5,现在orm提供的CharField,都是verchar,如果要改成char类型,orm是不支持的,你需要自己定义, 可以自己自定义一个类,固定长度的char

java_day15

我是研究僧i 提交于 2019-12-04 01:20:21
MySQL数据库 外键的级联 在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作 级联更新:ON UPDATE CASADE -- 主表主键修改,从表外键的值也跟着修改 级联删除:ON DELETE CASCADE -- 主表的主键删除,从表外键值相同的也删除 -- 例子 CREATE TABLE department ( -- 创建部门表 id INT PRIMARY KEY AUTO_INCREMENT, -- 部门ID 设置id自动增长 dep_name VARCHAR(20), -- 部门名字 dep_location VARCHAR(20) -- 部门地址 ); -- 添加2个部门 INSERT INTO department (dep_name, dep_location) VALUES ('研发部', '广州'), ('销售部', '深圳'); -- 创建员工表 CREATE TABLE employee ( id INT PRIMARY KEY AUTO_INCREMENT, -- 员工id NAME VARCHAR(30), -- 员工名字 age INT, -- 员工年龄 dep_id INT -- 部门id ); -- 在已有表增加外键约束 ALTER TABLE employee ADD CONSTRAINT employee_dep_fk