浅谈数据库主键策略 数据库表的主键很多童鞋都非常熟悉了,主键就是Primary Key,简称PK。...数据库主键的作用是唯一标识一条记录,所以在同一张表中,任意一条记录的主键都是唯一的,不然,数据库系统就无法根据主键直接定位记录。...虽然数据库系统本身对主键没有特别的要求,但是,写程序的时候,要考虑清楚使用什么类型的主键。正确地使用主键是存储数据成功的一半,错误地使用主键会让一个应用逐渐走向崩溃。...主键不可修改 对于数据库来说,主键其实是可以修改的,只要不和其他主键冲突就可以。但是,对于应用来说,如果一条记录要修改主键,那就会出大问题。...这种方式实现复杂,可靠性低,还不如数据库自增。 数据库自增最大的问题还不在于数据库单点造成无法水平切分,因为绝大部分公司还撑不到业务需要分库的情况就倒闭了。
主键、外键和索引的区别?...主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 该字段没有重复值,但可以有一个空值 作用: 用来保证数据完整性 用来和其他表建立联系用的...是提高查询排序的速度 个数: 主键只能有一个 一个表可以有多个外键 一个表可以有多个惟一索引 聚集索引和非聚集索引的区别?...PRIMARY KEY (主键)--用来唯一的标识出表的每一行,并且防止出现NULL值,一个表只能有一个主键约束....POREIGN KEY (外部键)--通过使用公共列在表之间建立一种父子(parent-child)关系,在表上定义的外部键可以指向主键或者其他表的唯一键.
1、自动增长字段: 自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。...这是我们设置主键的首选: innodb 中的主键是聚簇索引,会把相邻主键的数据放在相邻的物理存储位置上。...如果主键不是自增,而是随机的,那么频繁的插入会使 innodb 频繁地移动磁盘块; 在innodb中,别的索引还都要包含主键的值,因此建立索引时占用空间小; 利用数字,更容易比较排序。...缺点: 当我们需要在多个数据库间进行数据的复制时,自动增长型字段可能造成数据合并时的主键冲突。...)来作为主键,UUID算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成UUID。
在数据库设计时,主要就是对实体和关系的设计,实体表现出来就是表,关系表现出来就是外键。而对于一个表,由两部分组成:主键和属性。主键的简单定义就是表中为每一行数据的唯一标识。...数据库主键与业务主键 前面说到一个表可能有很多个唯一标识的候选键,那么这么多候选键中,哪个应该拿来做主键呢?...还有一个原因是业务主键在数据录入的时候不一定是明确知道的,有时我们会在不知道业务主键的情况下,就录入其他相关信息,这个时候,如果使用业务主键做数据库的主键,那么数据将无法录入。...主键值的生成 主键值的生成可以参考NHibernate的配置,概况下来主要有这么几种生成方式: 自增,这是SQL Server常用的主键生成方式,完全由数据库管理主键的值。...,但是由于我们大部分情况下都是使用主键检索数据,所以大部分数据库的默认实现,在建立主键时会自动建立对应的索引。
数据库设计主键类型的选择 数据库设计表时,主键(主属性...)的数据类型选择bigint还是GUID呢 在做数据库设计时,数据库主键以及其类型的选择犹为重要。...通常数据库主键字段的类型常被设计成 int(bigint)或 GUID 或自定义的格式类型,学习总结主键数据类型的选择。
读者提问: 想问下数据库中主键、外键、索引分别指的是什么?能用通俗一点的话解答下么?...阿常回答: 我们可以把数据库比做一个小区, 我们每个人就是具体的“数据”, 我们的每个家就是一张表, 每个家都会有一个唯一的门牌号,这就是主键。
聊一个实际问题:淘宝的数据库,主键是如何设计的? 某些错的离谱的答案还在网上年复一年的流传着,甚至还成为了所谓的MySQL军规。其中,一个最明显 的错误就是关于MySQL的主键设计。...大部分人的回答如此自信:用8字节的 BIGINT 做主键,而不要用INT。 错 !这样的回答,只站在了数据库这一层,而没有 从业务的角度 思考主键。主键就是一个自增ID吗?...站在2022年的新年档口,用自增做主键,架构设计上可能 连及格都拿不到 。 自增ID的问题 自增ID做主键,简单易懂,几乎所有数据库都支持自增类型,只是实现上各自有所不同而已。...全局唯一保证在各系统之间都是唯一的,单调 递增是希望插入时不影响数据库性能。 这里推荐最简单的一种主键设计:UUID。 UUID的特点: 全局唯一,占用36字节,数据无序,插入性能差。...在当今的互联网环境中,非常不推荐自增ID作为主键的数据库设计。更推荐类似有序UUID的全局 唯一的实现。 另外在真实的业务系统中,主键还可以加入业务和系统属性,如用户的尾号,机房的信息等。
batchId" from dual; end; OK了,先在插入数据测试下看自增主键是否生效。
又碰到有项目上的问这个问题 主键的作用: 1)保证实体的完整性; 2)加快数据库的操作速度 3)在表中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。...4) 数据库自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。...主键不是非要不可,可以从: 1.是否满足业务要求 2.数据查询效率(主键可以提高查询效率,当然合理的索引替代也可以) 这两个角度权衡是否需要主键。
主键的作用: 1)保证实体的完整性; 2)加快数据库的操作速度 3)在表中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。...4) 数据库自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。...主键不是非要不可,可以从: 1.是否满足业务要求 2.数据查询效率(主键可以提高查询效率,当然合理的索引替代也可以) 这两个角度权衡是否需要主键。 image.png
聊一个实际问题:淘宝的数据库,主键是如何设计的? 某些错的离谱的答案还在网上年复一年的流传着,甚至还成为了所谓的MySQL军规。其中,一个最明显的错误就是关于MySQL的主键设计。...大部分人的回答如此自信:用8字节的 BIGINT 做主键,而不要用INT。错 ! 这样的回答,只站在了数据库这一层,而没有 从业务的角度 思考主键。主键就是一个自增ID吗?...站在2022年的新年档口,用自增做主键,架构设计上可能连及格都拿不到 。 1、自增ID的问题 自增ID做主键,简单易懂,几乎所有数据库都支持自增类型,只是实现上各自有所不同而已。...全局唯一保证在各系统之间都是唯一的,单调递增是希望插入时不影响数据库性能。 这里推荐最简单的一种主键设计:UUID。 1、UUID的特点: 全局唯一,占用36字节,数据无序,插入性能差。...在当今的互联网环境中,非常不推荐自增ID作为主键的数据库设计。更推荐类似有序UUID的全局唯一的实现。 另外在真实的业务系统中,主键还可以加入业务和系统属性,如用户的尾号,机房的信息等。
读完需要6分钟 速读仅需2分钟 无论是做PHP开发还是做JAVA开发甚至前端开发,只要是开发,面试的时候都必考数据库。为什么前端也要考数据库?...因为数据库课程是计算机的基础课程,同样的基础课程还有操作系统,数据结构。只要写代码就永远跳不出这三门基础课。 面试官和面试者都知道要考数据库,都会去刷题,数据库的知识点其实很少,一天就能刷完。...面试谈到数据库肯定会谈到数据库引擎,不同索引的数据结构实现,SQL优化等。如果面试官直接问这几个问题,面试者肯定对答如流。...可能是数据越界,也可能是主键冲突,那就没有了标准答案,最后看谁的知识储备更多。一般来说一面面试官的技术不一定比面试者强。 二. 自增ID为什么用不完? 第一个问题是为了引出第二个问题。...因为自增主键通常会设置为`unsigned bigint`,最大值为18446744073709551615,假设我们的项目需要每秒记录100万条数据,这个自增ID使用100万年后都用不完。
自增主键带来的问题 在keywords表中,'id' 是主键,并且在定义中有auto_increment,表明其是自增主键。...这时候如果我们delete掉所有记录,并重新将备份的数据插入,会发现无法插入,因为这时候数据库中下一个值为667。...-- 先查询自增主键值 --> <selectKey...VARCHAR}, #{testproject_id,jdbcType=INTEGER}, #{notes,jdbcType=LONGVARCHAR}) 这样,就能解决数据库中自增
1.主键生成策略方式 ? 主键生成策略 2.基于Saas主键表生成主键id流程 由于我们的系统时基于Saas的,因此生成主键时,需要以租户id(TenantId)为基础进行生成。...为了生成的id符合我们的租户的要求,通常都会现将租户表建好,然后基于租户表中的租户id进行主键id的生成。此时便产生基于租户id生成主键,那么怎样生成主键id呢?可以查看下图: ?...(* com.xtt..*.dao.mapper..*.insert*(..))") public void primaryKeyRule() {} 也就是说在进行主键的生成时,我们拦截好需要生成的主键...拿到租户id后,就可以进行主键id获取了。 private void setPrimaryKey(Object entity, Class<?...return current; } 从而实现主键自增的目的,从而实现基于租户id进行自增的策略。
1,主键的删除 ALTER TABLE TABLENAME DROP PRIMARY_KEY 运行上面的SQL能够删除主键;假设不成功能够用 ALTER TABLE TABLENAME...DROP CONSTRAINTS COLUMN CASCADE; –删除约束 ALTER TABLE TABLENAME DISABLE PRIMARY_COLUMN ; –设置被设置为主键的列为无效...DROP INDEX INDEX_NAME; –删除主键索引 2,查看主键约束 SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE...=’P’ AND TABLE_NAME=’你要查看的表名’ AND OWNER=USER 3,创建联合主键 ALTER TABLE ADD CONSTRAINTS ‘约束名’ PRIMARY
char(8), cc date, primary key (aa,bb ) ); aa,bb为联合主键 不知道是不是因为mysql(6.0)的版本问题,还是各版本都是这种情况,mysql中创建联合主键...主键编号’, `IP` … mysql修改联合主键 参考 https://blog.csdn.net/BockSong/article/details/80933477 alter table TABNAME...NOT NULL ) ON [PRIMARY] GO SET ANSI_PADD … oracle 主键删除,联合主键的创建 1,主键的删除 ALTER TABLE TABLENAME DROP PRIMARY_KEY...运行上面的SQL能够删除主键:假设不成功能够用 ALTER TABLE TABLENAME DROP C … Oracle 主键、联合主键的查询与创建 –查询某个表是否有唯一主键 select cu....联合索引 我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升
我们介绍一种基于数据库维护自增 ID 区间,结合内存分配的策略,这也是淘宝的 TDDL 等数据库中间件使用的主键生成策略。...使用这种方式首先在数据库中创建 sequence 表,其中的每一行,用于记录某个业务主键当前已经被占用的 ID 区间的最大值。...id`), UNIQUE KEY `unique_name` (`app_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 接下来插入一条行记录,当需要获取主键时...,首先访问对应数据库的 sequence 表,更新对应的记录,占用一个对应的区间。...为了防止单点故障,sequence 表所在的数据库,通常会配置多个从库,实现高可用。
insert into test_auto_increase (name) values('mrzhan'); --查询验证 select * from test_auto_increase; 自增量主键设置完毕...PS:自增主键触发器创建模板: create or replace trigger 触发器名 before insert on 表名 for each row begin select 序列名....nextval into:new.主键 from dual; end;
http://blog.csdn.net/tiantian1980/article/details/1603126 外键是数据库一级的一个完整性约束,就是数据库基础理论书中所说的“参照完整性”的数据库实现方式...2、使用外建,简单直观,可以直接在数据模型中体现,无论是设计、维护等回有很大的好处,特别是对于分析现有的数据库的好处时非常明显的--前不久我分析了一个企业现有的数据库,里面的参照完整性约束有的是外键描述...http://www.cnblogs.com/ywb-lv/archive/2012/03/12/2391860.html 定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 一、主键是能确定一条记录的唯一标识...二、主键、外键和索引的区别 定义: 主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引--该字段没有重复值,但可以有一个空值...作用: 主键--用来保证数据完整性 外键--用来和其他表建立联系用的 索引--是提高查询排序的速度 个数: 主键--主键只能有一个 外键--一个表可以有多个外键 索引--一个表可以有多个唯一索引
主键本身是很简单的,但是围绕他产生的故事就不是那么简单了。 1、 管理 这个是最重要的,没有规矩不成方圆,主键要如何管理一定要实现确定好了,甚至有必要为此写一个规范。...2、 定义 不是说“主键”这个词的定义,而是主键用什么,比如用GUID还是用int,还是年月日时分秒+流水? 3、 生成 主键用什么确定好了之后就是如何生成了。...比如GUID,是在程序里生成,还是由数据库的字段默认值来生成?采用无序的GUID还有有序的GUID?再比如int,是采用MSSQL 的自增,还是自己管理。...5、 效率 主键要不要设置索引?聚集的还是非聚集的,还是不用索引?int的和GUID的效率到底差了多少? 6、 移植 要不要考虑数据库的移植,以后会不会更换数据库?换数据库了会不会崩溃?...7、 数据合并 几个分公司的数据需要合并到一起,主键是否会冲突(重复)? 说这些的目的就是想让大家讨论的时候更明确一些,虽然我们都在讨论主键,但是这个范围也是很大的。 欢迎大家继续补充。
领取专属 10元无门槛券
手把手带您无忧上云