外键

SQL Server数据库原理及部署

╄→尐↘猪︶ㄣ 提交于 2019-12-27 18:08:43
一、使用数据库的必要性 使用数据库可以高效且条理分明地存储数据,使工作人员能够更加迅速、方便地管理数据。数据库具有以下特点: 可以结构化的存储大量的数据信息,方便用户进行有效的检索和访问; 可以有效地保持数据信息的一致性、完整性、降低数据冗余; 可以满足应用的共享和安全方面的要求; 常见的数据库有:SQL Server、MySQL、Oracle等,SQL Server是运行在Windows操作环境中,拥有相对比较友好的图形化界面。 二、数据库的基本概念 1、数据 描述事物的符号记录称为数据,数据不仅仅包括数字、文字、图形、图像、声音、档案记录等都是数据。在数据库中,数据是以“记录”形式按统一的格式进行存储的,而不是杂乱无章的。 2、数据库和数据库表 不同的记录组织在一起,就形成了数据库的“表”。也可以说,表是用来存储具体数据的。简单地说,数据库就是表的集合,它是以一定的组织方式存储的相互有关的数据集合。通常,数据库并不是简单的存储这些数据的,还要表示他们之间的关系,因此,关系的描述也是数据库的一部分。 3、数据库管理系统和数据库系统 数据库管理系统(Database Management System,DBMS)是实现对数据库资源有效组织、管理和存取的系统软件。DBMS主要包括以下功能: 数据库的建立和维护功能; 数据定义功能; 数据操纵功能; 数据库的运行管理功能; 通信功能;

Serializers 序列化组件

蓝咒 提交于 2019-12-27 14:50:12
Serializers 序列化组件 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式。 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到的数据进行序列化。 接下来我们看下django序列化和rest_framework序列化的对比~~ Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objects.values("id", "title", "chapter", "pub_time", "publisher") book_list = list(book_list) # 如果我们需要取外键关联的字段信息 需要循环获取外键 再去数据库查然后拼接成我们想要的 ret = [] for book in book_list: pub_dict = {} pub_obj = Publish.objects.filter(pk=book["publisher"]).first() pub_dict["id"] = pub_obj.pk pub_dict["title"] = pub_obj.title book["publisher"] = pub_dict ret.append(book

DRF的序列化

自作多情 提交于 2019-12-27 11:06:30
为什么要序列化组件 前后端分离,数据交互一般都是Json格式, Json是一个较为轻量级的数据交互格式, 给前端的数据都要成Json格式,需要我们对数据库中的数据进行序列化 下面是Django序列化和rest_framework序列化的对比 Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objects.values("id", "title", "chapter", "pub_time", "publisher") book_list = list(book_list) # 如果我们需要取外键关联的字段信息 需要循环获取外键 再去数据库查然后拼接成我们想要的 ret = [] for book in book_list: pub_dict = {} pub_obj = Publish.objects.filter(pk=book["publisher"]).first() pub_dict["id"] = pub_obj.pk pub_dict["title"] = pub_obj.title book["publisher"] = pub_dict ret.append(book) ret = json.dumps(book_list, ensure_ascii=False

DRF 04

≯℡__Kan透↙ 提交于 2019-12-27 08:35:16
目录 基表 外键字段参数 db_constraint 数据库关联 related_name: 反向查询辅助名 on_delete 级联关系 子序列化 基表 基表只提供公有字段, 不参与数据库迁移 在基表下的配置类 class Meta: 中设置: abstract = True , 表明该表为抽象表, 不参与数据库迁移 # 基表 class Base(models.Model): is_delete = models.BooleanField(default=False) created_time = models.DateTimeField(auto_now=True) class Meta: # 表明该表为抽象表, 只提供公有字段, 不参与数据库迁移 abstract = True 外键字段参数 db_constraint 数据库关联 断关联: db_constraint=False , 既数据库中不会建立外键关系, Django在代码层面上实现两表关联 优点 不会影响连表查询操作效率 可以提升连表增删改效率 易于后期数据库表的重构 缺点 数据库本身没有连表检测, 容易出现脏数据 (需要通过严格的逻辑避免, 必要时管理脏数据) class Book(Base): name = models.CharField(max_length=64) price = models

基表、多表关系及子序列化

时光毁灭记忆、已成空白 提交于 2019-12-26 18:09:42
目录 基表: 概念:为抽象表,是用来被继承的,提供公有的字段,自身不会完成数据库迁移 断关联表关系: 优点: 缺点: 表关系: 外键字段属性: 子序列化: class Book(BaseModel): name = models.CharField(max_length=64) price = models.DecimalField(max_digits=10, decimal_places=2) publish = models.ForeignKey(to='Publish', related_name='books', db_constraint=False, on_delete=models.DO_NOTHING, null=True) authors = models.ManyToManyField(to='Author', related_name='books', db_constraint=False) def __str__(self): return self.name class Publish(BaseModel): name = models.CharField(max_length=64) address = models.CharField(max_length=64) class Author(BaseModel): name = models

SQL查询语句大全

◇◆丶佛笑我妖孽 提交于 2019-12-26 08:13:02
SQL查询语句大全 一、 简单查询   简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。   例如,下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段。   SELECT nickname,email   FROM testtable   WHERE name='张三'   (一) 选择列表   选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。   1、选择所有列   例如,下面语句显示testtable表中所有列的数据:   SELECT *   FROM testtable   2、选择部分列并指定它们的显示次序   查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。   例如:   SELECT nickname,email   FROM testtable   3、更改列标题   在选择列表中,可重新指定列标题。定义格式为:   列标题=列名   列名 列标题   如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:   SELECT 昵称=nickname,电子邮件=email   FROM testtable   4

pt-online-schema-change解读

我是研究僧i 提交于 2019-12-25 22:29:37
【用途】 在线改表 【注意风险】 因为涉及到修改表的数据和结构,所以在使用前要小心测试并做好备份,工具默认不会改表,除非你添加了--execute参数 【工具简介】 pt-osc模仿MySQL内部的改表方式进行改表,但整个改表过程是通过对原始表的拷贝来完成的,即在改表过程中原始表不会被锁定,并不影响对该表的读写操作。 首先,osc创建与原始表相同的不包含数据的新表并按照需求进行表结构的修改,然后将原始表中的数据按chunk大小逐步拷贝到新表中,当拷贝完成后,会自动同时修改原始表和新表的名字并默认将原始表删除 这个过程中有两个问题需要注意: 1. 触发器 因为整个过程是在线的,为了将改表过程中对原始表的更新同时更新到新表上,会创建相应的触发器,每当发生针对原始表的增删改操作,就会触发对新表的相应的操作。所以原始表上不能有其他触发器,即如果原始表上存有触发器,OSC会罢工的 2. 外键 外键使改表操作变得更加复杂,如果原始表上有外键的话,自动rename原始表和新表的操作就不能顺利进行,必须要在数据拷贝完成后将外键更新到新表上,该工具有两种方法来支持这个操作,具体后面参数部分(--alter-foreign-keys-method)介绍 【使用示例】 pt-online-schema-change [OPTIONS] DSN 添加一个列: pt-online-schema-change

sql server 复习笔记2

末鹿安然 提交于 2019-12-25 14:13:53
主键约束 可以通过定义primary key 约束来定义主键, 用于强制表的实体化完整性,一个表只能有一个主键约束, 并且primary key 约束中的列不能为空值,由于primary key 约束可保证数据的一致性,因此经常对标识列定义这种约束。 1:创建主键约束 CREATE table alex_class ( q_id int PRIMARY key , -- 主键约束 msg VARCHAR(30), number int ) 外键约束 通过定义foreign key 约束来创建外键,在外键引用中,当一个表的列被引用 作为另一个表的主键值时,就在两个表之间创建了连接,这个列就是成为第二个表的外键。 1 创建外表约束 CREATE table alex_students1( id int PRIMARY KEY, name VARCHAR(30), age int, c_id int, FOREIGN key (c_id) REFERENCES alex_class(q_id) ) 解释: 如图学生表中的c_id 字段是 班级表中的主键字段 来源: https://www.cnblogs.com/baili-luoyun/p/11049073.html

sql级联删除

允我心安 提交于 2019-12-25 14:05:55
功能:在删除主表时,自动删除副表(外键约束)相应内容 删除包含 主键 值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。 如: create database temp go use temp go create table UserInfo ( UserId int identity(1,1) primary key , UserName varchar(20), --用户名 password varchar(20) not null --密码 ) create table UserDetails ( id int identity(1,1) primary key, name varchar(50) not null, --真实姓名 userId int, foreign key (userId) references UserInfo(UserId) on delete cascade ) insert UserInfo values ('ly','jeff') insert UserInfo values('wzq','wzqwzq') insert UserInfo values('lg','lglg') insert UserDetails values('李四',1) insert UserDetails

Mysql 常用操作

瘦欲@ 提交于 2019-12-25 10:36:08
一、mysql 5.7修改root密码 如果 MySQL 正在运行 首先杀之: killall -TERM mysqld。 运行 mysqld_safe --skip-grant-tables & 如果此时不想被远程连接: mysqld_safe --skip-grant-tables --skip-networking & 使用mysql连接server mysql 更改密码 update mysql.user set authentication_string=password('1122qqWW') where user='root' and Host = 'localhost'; 特别提醒注意的一点是,新版的mysql数据库下的user表中已经没有Password字段了 而是将加密后的用户密码存储于authentication_string字段 mysql> flush privileges; mysql> quit; 修改完毕。重启 killall -TERM mysqld service mysql start 二、创建用户 创建一个只能在本机登陆的用户 create user '用户名'@'localhost' identified by '用户的密码'; 创建一个只能由特定远程主机使用的帐户 create user '用户名'@'远程IP地址' identified