数据库主键

数据库的三大范式以及五大约束

匿名 (未验证) 提交于 2019-12-02 23:51:01
数据库的三大特性可谓是:实体属性和关系。 第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性; 第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情; 第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键); 【如何更好的区分三大范式】 【数据库五大约束】 1.primary KEY:设置主键约束; 2.UNIQUE:设置唯一性约束,不能有重复值; 3.DEFAULT 默认值约束,height DOUBLE(3,2)DEFAULT 1.2 height不输入是默认为1,2 4.NOT NULL:设置非空约束,该字段不能为空; 5.FOREIGN key :设置外键约束。 【主键】 1.主键的注意事项? 主键默认非空,默认唯一性约束,只有主键才能设置自动增长,自动增长一定是主键,主键不一定自动增长; 2.设置主键的方式? 在定义列时设置:ID INT PRIMARY KEY 在列定义完之后设置:primary KEY(id) 【外键】 2设置外键的语法: 参照操作可选值:

数据库三大范式

人走茶凉 提交于 2019-12-02 23:39:29
网络转载 范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。下面就简单介绍下这三个范式。 ◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 考虑这样一个表:【联系人】(姓名,性别,电话) 如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨别,但是 2NF 和 3NF 就容易搞混淆。 ◆ 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。 考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。 因为我们知道在一个订单中可以订购多种产品,所以单单一个

python数据库基础

匿名 (未验证) 提交于 2019-12-02 22:51:30
1.数据类型:(使用原则:够用就行,尽量使用范围小的) 整数:int,bit 小数:decimal 字符串:varchar(可变长度),char(固定长度字符串) 日期时间:date,time,datetime 枚举类型(enum) 特别说明2.约束(限制)主要: 主键primary key:物理存储的顺序 非空 not null 不允许填写空格 唯一 unique:不允许重复 默认default:数据项的默认值 外键 foreign key:存储其他表的主键的字段其他: unsigned 无符号 auto increment 自增4.常用术语: 数据库: 数据库是一些关联表的集合。 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。 外键:外键用于关联两个表。 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。 参照完整性:

Mysql基础2-数据定义语言DDL

匿名 (未验证) 提交于 2019-12-02 22:06:11
数据库操作语句 数据表操作语句 视图定义语句 数据库表设计原则    数据库操作语句   创建库    create database dbname [charset 字符编码] [collate 排序规则]; 如: create database db charset utf8 collate utf8_general_ci;   查询库   1   2)   3) 显示所有数据库:   4) 显示一个数据库的创建语句:   删除库   4) drop database [if exists] 数据库名 drop database if exists db;   5) 修改数据库(只能修改数据库的选项): alter database 数据库名 charset 新的编码 collate 新的排序规则     数据库修改只能修改: 修改编码,修改排序规则   选择库   8) 选择数据库: use dbname; 表操作语句   基本形式: -- 形式1: create table [if not exists] 表名 (字段列表[, 索引或约束列表])[表选项] -- 形式2: create table [if not exists] 表名 (字段1, 字段2, ..... [, 索引1, 索引2,...., 约束1, 约束2, ......])       字段属性    

MySQL 主键 外键 索引

匿名 (未验证) 提交于 2019-12-02 22:06:11
主键: 外键:   假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。用来保存整机产品信息的表叫做 Pc;用来保存配件供货信息的表叫做Parts。   在Pc表中有一个字段,用来描述这款电脑所使用的CPU型号;   在Parts 表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表。   很显然,这个厂家生产的电脑,其使用的CPU一定是供货信息表(parts)中存在的型号。这时,两个表中就存在一种约束关系(constraint)――Pc表中的CPU型号受到Parts 表中型号的约束。   首先我们来创建 parts 表: CREATE TABLE parts ( ... 字段定义 ..., model VARCHAR(20) NOT NULL, ... 字段定义 ... );   接下来是Pc表: CREATE TABLE pc ( ... 字段定义 ..., cpumodel VARCHAR(20) NOT NULL, ... 字段定义 ... };   设置索引   若要设置外键,在参照表(referencing table,即Pc表) 和被参照表 (referenced table,即parts表) 中,相对应的两个字段必须都设置索引(index)。   对Parts表:   ALTER TABLE parts ADD INDEX

mysql优化(二)

匿名 (未验证) 提交于 2019-12-02 22:06:11
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。 主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。 创建主键索引 主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是

mysql id 自增实现

匿名 (未验证) 提交于 2019-12-02 22:06:11
1、在mysql中建表 2、使用: >insert into 表名 values(id,'www',66); 连续运行5次后结果: ============================================================================================ id自增优缺点: 优点: 数据库自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利; 数字型,占用空间小,易排序,在程序中传递也方便; 如果通过非系统增加记录时,可以不用指定该字段,不用担心主键重复问题 缺点: 因为自动增长,在手动要插入指定ID的记录时会显得麻烦,尤其是当系统与其它系统集成时,需要数据导入时,很难保证原系统的ID不发生主键冲突。特别是在新系统上线时,新旧系统并行存在,并且是异库异构的数据库的情况下,需要双向同步时, 自增主键将是你的噩梦 ; 在系统集成或割接时,如果新旧系统主键不同是数字型就会导致修改主键数据类型,这也会导致其它有外键关联的表的修改,后果同样很严重; 若系统也是数字型的,在导入时,为了区分新老数据,可能想在老数据主键前统一加一个字符标识(例如“o”,old)来表示这是老数据,那么自动增长的数字型又面临一个挑战。 UUID:含义是通用唯一识别码,指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的

mysql/mariadb 初体验

匿名 (未验证) 提交于 2019-12-02 22:02:20
距离申请这个博客号已经过了九个月,思前想后还是把知识沉淀放这里吧,不过初心一样,依旧是 '谨以此文,见证成果'。有 兴趣的话也欢迎大家去我的 csdn博客 转一转。以下是正文: 1. mysql安装 2.cmd/power shell下mysql/mariadb登陆验证。 4. 常用数据库操作: 约定 :为了 加强理解,使用大写。敬请留意数据库英文名的复数形式。       .......       ...     PRIMAER KEY:主键,一个表里只能有一个主键,这 个主键具有唯一性,自动为not null     AUTO_INCREMENT:自动编号,必须与主键连用, 默认值为1,随主键个数自增1.    CURD是对数据库进行处理的基本操作,创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)                          c. update : 更改数据 必须要添加条件,否则该数据表内所有数据都会被更改! )      5.退出mysql 以上。 文章来源: https://www.cnblogs.com/hjk1124/p/11398515.html

Mysql表设计需要注意的问题

匿名 (未验证) 提交于 2019-12-02 22:02:20
下面探讨的数据库为MySQL 存储引擎为innodb因为这是最常见的,使用最多的数据库和引擎 什么是页分裂? 这是因为聚簇索引采用的是平衡二叉树算法,而且每个节点都保存了该主键所对应行的数据,假设插入数据的主键是自增长的,那么根据二叉树算法会很快的把该数据添加到某个节点下,而其他的节点不用动;但是如果插入的是不规则的数据,那么每次插入都会改变二叉树之前的数据状态。从而导致了页分裂。 为什么一定要设置一个主键 因为就算你不主动设置一个主键,innodb也会帮你生成一个隐藏列,作为自增主键来使用。所以,不管怎么样都会有自增主键,还不如自己指定一个,主键索引可以提高查询效率。 主键使用自增还是UUID 主键肯定是用自增。innodb种的主键是聚族索引,如果主键是自增的,那么每次插入的新数据都会顺序添加到当前索引节点的后续位置,当一页写满时,就会自动开启第二页,如果不是自增主键,那么就可能在中间插入,就会引发页的分裂,产生很多碎片,总之用自增主键性能更好。 UUID产生的索引文件更大,当数据量超过一百万行时,主键查询性能和索引文件大小都比UUID要更有效率和更小。 主键为什么不推荐有业务含义 1)因为任何含有业务的列都有改变的可能性,主键一旦带上业务含义,那么主键就有可能发生改变。主键发生改变,该数据在磁盘上的存储位置就会发生更改,有可能引发页分裂,产生空间碎片。 2

MySQL聚簇索引

匿名 (未验证) 提交于 2019-12-02 21:59:42
MySQL作为迭代了很多个版本的数据库。在数据库的索引上实现了很多的优化版本,从一开始的只允许一个表有一个列为索引值,到目前版本可支持多个列建立索引值,更多关于索引优化版本的描述,以后有机会笔者再写一篇文章。本文主要介绍索引当中的聚簇索引。 MySQL官方对聚簇索引的定义是,聚簇索引并不是一种单独的索引类,而是一种数据存储方式,第一次看到这段描述,我相信很多人都会一头雾水,索引是一种数据存储结构?这怎么解释?下面笔者一步一步来讲述MySQL对聚簇索引的定义和具体运用。 首先上贴一张图 在MySQL中,有一列值,专门被设定为聚簇索引,这列值就是主键,通常为数字类型的字段。那么如果数据表中没有主键呢?MySQL的解决办法是隐式地将一个唯一的非空的列定义为聚簇。那如果这也没有呢?MySQL就自己创建一个聚簇索引,具体这个聚簇索引内部是怎么建立的,笔者还需要去学习学习。反正无论如何,MySQL都会创建一个聚簇索引。 那么为什么说聚簇索引是一种数据存储结构呢?原因是MySQL将索引(即主键)对应的每一条记录都以链表的形式存储在索引的叶子页中,那么很容易理解,聚簇索引就是表,而反过来说,表以聚簇索引的形式来存储。那么是所有的MySQL存储引擎都采用聚簇索引这种数据存储结构吗?答案是否定的,在MySQL中,只用Innodb引擎才采用聚簇索引,其他的存储引擎像MyISAM采用非聚簇索引。