外键

python后端面试第三部分:数据储存与缓存相关--长期维护

感情迁移 提交于 2020-01-22 15:34:57
################## 数据储存与缓存相关 ####################### mysql数据库, redis数据库, 9. MySQL的索引一般是怎么实现的? B-Tree(一般是B+Tree)和Hash,然后再简单介绍一下。 存储 存储可能包含rdbms,nosql以及缓存等,我以MySQL,redis举例。 mysql相关 mysql 是流行的RDBMS 关系型数据库 1.谈谈mysql字符集和排序规则? 2.var char与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符 char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10, 除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。 尽管如此,char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。 再者,char的存储方式是,对英文字符

55.ORM外键:引用同app下的不同模型,引用不同app下的模型,引用模型自身使用详解

爱⌒轻易说出口 提交于 2020-01-20 22:23:10
外键和表关系 外键是属于数据库级别的,在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常强大。因此这里我们首先来介绍外键在Django中的使用。 类定义为 class ForeignKey(to,on_delete,**options)。第一个参数to是应用的哪个模型(也就是应用的表),第二个参数on_delete在使用外键应用的模型数据被删除了,这个字段该如何处理。举例说明,如果有一个user和一个Article两个模型。一个user可以发表多篇文章,一个Article只能有一个Author,并且通过外键进行应用。 1. 使用外键引用同一个APP中的不同模型,示例代码如下: # 注意:在定义一个模型的时候,模型的名字的首字母一定要大写,否者的话,模型名字下面会出现波浪线。 class User(models.Model): username = models.CharField(max_length=20) password = models.CharField(max_length=100) class Article(models.Model): title = models.CharField(max_length=100) content = models

JAVA备忘录(三):数据库面试题

放肆的年华 提交于 2020-01-20 19:02:51
一.基本概念 1.超键,候选键,主键,外键是什么 超键:在关系中能够唯一标识一个元组的属性集称为超键。超键可以是一个属性,也可以是多个属性的组合。 候选键:不含多余元素的超键。也就是说,只要删除候选键中的任意一行属性,它就不再能唯一标识一个元组了。 主键:由用户自主选择的能唯一标识一个元组的键,它是超键的一部分。主键的取值不能为空。 外键:在一个关系模式中,存在一个属性,它是其他关系模式的主键,那么称其为当前关系模式的外键。 参考: SQL–超键、候选键、主键、外键的认识和区分 . 2.为什么选择自增列作为主键。 如果选择自增列作为主键,每次插入新纪录时,直接添加在当前记录末尾的后续位置即可,当一个页写满了,就会 开辟一个新的页。 而如果使用非自增列作为主键,比如说像身份证号码,学号这样近似无规则的属性。那么数据块为了维护索引, 会频繁地进行移动原有的数据,分页等操作。一来会增加大量的开销,二来分页操作会导致大量的碎片,使得 索引结构不紧致。 例如在聚集索引中,插入一个随机索引值的数据可能会使数据库为了维护索引而大量地对原有数据进行物理地址的 移动。而在非聚集索索引中,则涉及指针的变动。 3.触发器的作用 触发器是一种特殊的存储过程,主要是通过事件来触发执行的,这些事件包括UPDATE,DELETE,和INSERT操作。 触发器的使用可以强化约束,保证数据库的完整性和一致性

Django自带mysql orm操作插入外键的正确打开方式

会有一股神秘感。 提交于 2020-01-19 16:50:57
在给网站数据库优化的过程中,需要给几张表增加外键限制,方便管理员界面的联表操作。 调研发现,网上提供的几种models的配置都不能让我的插入程序成功运行,在经过尝试之后总结出了一个终极解决方案。 我的环境:Django==2.1.7,Python==3.6.1 我建表一般先过Navicat这种可视化软件来生成mysql数据库,所以我们直接在建表之后使用下面语句直接生成。 python manage.py inspectdb > app/models.py // 'app' 是我项目名称 生成的models.py部分代码: class InfoUpload(models.Model): # 子表 upload_id = models.AutoField(primary_key=True) contact_email = models.ForeignKey('InfoUser', model.DO_NOTHING, db_column='contact_email') class Meta: managed = False db_table = 'info_upload' class InfoUser(models.Model): # 主表 user_id = models.AutoField(primary_key=True) contact_email = models

python day36

一曲冷凌霜 提交于 2020-01-18 13:08:26
今日内容 表与表之间建关系 外键  一对多  多对多  一对一所有的信息都记录在一张表中所带来的问题 1.表的结构不清晰 2.浪费硬盘空间 3.表的扩展性极差(无法忽略的缺点) PS:类似于我们将所有的代码都写在用一个py文件内 确立表与表之间的关系,一定要换位思考(必须两方都考虑周全之后才能得出结论)以员工表和部门表为例: 先站在员工表看能否有多个员工对应一个部门 分析: 一个部门能否有多个员工 可以!!!(暂时只能确定员工单向多对一部门) 再站在部门表看能否有多个部门对应一个员工 分析: 一个员工能否属于多个部门 不可以!!!结论: 员工表和部门表之间仅仅是 单向的多对一 那么它们的表关系就是 "一对多" 表关系中没有多对一一说,只有一对多 ( 无论是多对一还是一对多都叫"一对多" ) 关于让两种表有代码层面上真正的关联,必须使用外键什么是外键? 让表与表有硬性层面上的关系foreign key 外键约束 1.在创建表的时候 必须先创建被关联表 2.插入数据的时候 也必须先插入被关联表的数据 # 建表 create table dep( id int primary key auto_increment, dep_name varchar(32), dep_desc varchar(128) ); create table emp( id int primary key

drop table中cascade的含义及用法

不想你离开。 提交于 2020-01-17 08:56:02
在删除一个表时,如果该表的主键是另一个表的外键,如果不用cascade关键字就会报错: SQL> drop table dict_loc_type; drop table dict_loc_type ORA-02449: 表中的唯一/主键被外键引用 使用cascade关键字,表被成功删除: SQL> drop table dict_loc_type cascade constraints; Table dropped 使用flashback语句可以恢复被删除的表,但是被删除的外键无法恢复: SQL> flashback table dict_loc_type to before drop; Done 来源: CSDN 作者: 萳風 链接: https://blog.csdn.net/qq_38748853/article/details/103767247

数据库报错Cannot delete or update a parent row: a foreign key constraint fails

爱⌒轻易说出口 提交于 2020-01-17 01:48:15
(1)SQL语句 (2)表的关系图 存在问题: 无法删除或更新父行:外键约束失败 原因:存在外键约束 存在外键约束的规则: (1)级联删除,就是删除主键表的同时,外键表同时删除。 (2)、约束/限制当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。(即外键表约束主键表) (3)SET NULL当取值为Set Null时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(,一样是外键表约束主键表,不过这就要求该外键允许取null)。 解决方法 先关闭外键约束,执行删除操作,然后再开启外键约束 来源: CSDN 作者: 十五期 赵千乔 链接: https://blog.csdn.net/weixin_40486955/article/details/104011048

抓出外键没创建索引的表

喜你入骨 提交于 2020-01-16 19:58:19
create table parent_tb_test ( id number(10), name varchar2(32), constraint pk_parent_tb_test primary key(id) ); create table child_tb_test ( c_id number(10), f_id number(10), child_name varchar2(32), constraint pk_child_tb_test primary key(c_id), foreign key(f_id) references parent_tb_test ); SQL> select * from user_tables; no rows selected SQL> select * from user_indexes; no rows selected SQL> select table_name from user_tables; TABLE_NAME ------------------------------ CHILD_TB_TEST PARENT_TB_TEST SQL> select index_name from user_indexes; INDEX_NAME ------------------------------ PK_CHILD_TB

SQL语言之增删改_约束_序列

梦想的初衷 提交于 2020-01-16 18:36:47
文章目录 SQL语言之增删改、约束、序列 SQL增删改--对表或字段操作 约束 非空约束 默认值约束 唯一约束 主键约束 主键约束和唯一约束的区别 外键约束 Check约束 序列 SQL语句增删改--对表中的数据操作 INSERT语句 UPDATE语句 DELETE语句 SQL语言之增删改、约束、序列 SQL增删改–对表或字段操作 删除表 ​ drop table 表名 ; 添加字段 ​ alter table 表名 add 字段名 类型; 修改表中字段类型 ​ alter table 表名 modify 字段名 新类型; 修改表中字段名 ​ alter table 表名 rename column 原字段名 to 新名; 删除字段 ​ alter table 表名 drop column 字段名; 实例代码如下: -- 1.修改表名 alter table student rename to t_student; -- 2.删除学生表 drop table t_student; -- 3.添加字段 alter table t_student add sweigtht number(5,2); -- 4.修改表中的字段类型 alter table t_student modify sweigtht varchar2(5); -- 5.修改表中的字段名 alter table t

SQL初次接触

女生的网名这么多〃 提交于 2020-01-16 16:37:16
1.SQL对大小写不敏感 2.部分SQL数据库要求结尾分号 3.分为两种DML(数据操作语言)和DDL(数据定义语言) sql中一些注意要点 1.设置主键 一般会在一个数据内设置一个主键(名字通常为id)并设置 表设计器 里的 标识规范 中更改为是 用于自动生成id并作为唯一值确定该数据(输入数据可不填,如果id设置为自增(标识增量,标识种子存在)) 2. 主键与外键 主键:具有唯一性,必须在设置主外键关系时选择设定为唯一的列作为主键,是唯一值 外键:属于主键的外部关系,用于设定外键对应的各种外部关系 在设置关系时,可以在主外键insert和update规范里选择级联,能使得主键的删除导致全部外键删除 (包括更新规则与删除规则) 3.数据类型 在设置字符数据类型nchar后括号内的数字代表最大存储字数,如果超过会发生无法解决的问题,应避免 null值的允许与否可以取决于该列是否必须存在,也可验证某些数据组合是否正确 4.设置一对多关系 通过单个主键对应多个外键的方式来实现 5.多对多 用一张表来刻画多对多关系,并将这个关系表的内容以外键形式与唯一存储这些对象的表内的相应数据为主键建立关系 6.分离,附加数据库 分离:右击相应数据库,在任务中选取分离,设置相应参数后,点击分离(可以默认) 注意 :分离前应确认不在引用或者刚刚开启过相应数据库,如果开启过可以重新打开SQL再次分离