首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >即使我不能将主键用于数据库操作,也必须使用序列生成的主键吗

即使我不能将主键用于数据库操作,也必须使用序列生成的主键吗
EN

Stack Overflow用户
提问于 2010-02-18 14:36:08
回答 5查看 1.3K关注 0票数 1

嗨,我有一个父表,它有ID和其他一些列,还有一个子表,它有很多基于这个ID(外键)的值。我想使用主键sequence和这个父表ID作为外键来创建表,但是后来我发现我又多了一个外键EMPID,通过组合可以提供唯一性。即使对于检索和批量更新,我也可以简单地使用这两个FK的组合。那么,我是否仍然需要使用序列生成器,同时考虑到DB的性能,或者只是删除主列。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-18 14:39:02

如果您确信永远不需要或不想引用序列生成键(且其他对象都不会引用该ID),那么删除它应该是安全的,只要您可以您的外键组合将始终提供唯一的组合。

如果您确实注意到了性能问题,您可能希望索引作为外键的列(现在,外键将作为主键),以提高查询这些列的性能。

票数 2
EN

Stack Overflow用户

发布于 2010-02-18 14:52:11

关系纯化论者会告诉您,根本不需要顺序生成的ID列-每个表中的主键应该是唯一标识每行的列的组合。(如果有多个执行此操作的列组合,则选择一个作为主键,并使用唯一约束强制其他列)。

当这些列中有一个或多个列很大或不方便时,或者这样的列的数量使主键本身变得很大和不方便时,这种情况往往会出现问题。这就是我与关系纯化论者不同的地方,我说继续,添加一个代理键(这是标识/序列ID列更恰当的名称)。但是要确保其他键仍然使用唯一性约束来强制执行。

所以可以肯定的是,没有理由必须在表中有一个ID列。如果每个表都必须有一个,您会认为DB产品会自动为您提供它。

票数 1
EN

Stack Overflow用户

发布于 2010-02-18 22:10:01

(我本想把这段话放在评论里,但是太长了。)

主键在理论上不必是不可变的;然而,在现实世界中,拥有可变的主键是一场噩梦,原因有两个:

  1. 随着关系模型的增长,每个子表必须包含父表的主键的每一列。与所有唯一约束一样,
  2. 主键也是由索引强制执行的。
  3. 有些数据库管理系统的索引中根本没有足够的列来满足这种自然的键结构。
  4. 同样,对索引键的数据长度也存在长度要求。
  5. 最后,可变主键必须在整个系统中级联。

简而言之:

如果您的键值可能会发生更改,可能会更改

--信用卡号码或帐号是一个坏的主键,因为它可以改变,而名字是一个非常糟糕的选择

您有任何通过外键依赖于此表的数据(当需求出现时,重构此表非常容易)

先使用,然后使用

创建一个代理键作为主键。您已经找到了表的自然键,这很棒;在这些列上也放置了一个惟一的约束。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2289328

复制
相关文章
基于Saas主键表生成主键id
首先需要对当前的id进行拦截操作,也即使用aop的切面Aspect对切点进行拦截,在进行新增的时候进行拦截:
路行的亚洲
2021/06/24
1.8K0
数据库表可以没有主键吗?
3)在表中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
matinal
2020/11/30
2.3K0
39 | 自增主键不连续
然后插入数据,最后看到,表会自动生成一个AUTO_INCREMENT的值,ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 ,表示下一次插入数据时,如果需要自动生成自增值,会生成 id=11。
HaC
2020/12/30
4.9K0
39 | 自增主键不连续
数据库表可以没有主键吗?
3)在表中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
matinal
2020/10/30
4.5K0
数据库表可以没有主键吗?
oracle 主键删除,联合主键的创建
ALTER TABLE TABLENAME DROP PRIMARY_KEY
全栈程序员站长
2022/07/13
3K0
自增主键不连续的几种情况
最近在极客时间上学习丁奇大佬的《MySQL 45讲》,这里结合自己的理解分享出来,喜欢的同学可以购买原版课程进行学习,里面的内容很丰富。
AsiaYe
2020/05/27
3.5K0
大战MySQL主键及其操作
《原则》原文:但我不敢确信这场转型会顺利,因为我没有经历过这样的事情。我做事的方式是试错:犯错,找出错误原因,总结出新的原则,最终成功。而我觉得应该以同样的态度对待这场转型。
小Bob来啦
2020/12/08
4.4K0
大战MySQL主键及其操作
.NET生成MongoDB中的主键ObjectId
  因为很多场景下我们需要在创建MongoDB数据的时候提前生成好主键为了返回或者通过主键查询创建的业务,像EF中我们可以生成Guid来,本来想着要不要实现一套MongoDB中ObjectId的,结果发现网上各种各样的实现都有,不过好在阅读C#MongoDB驱动mongo-csharp-driver代码的时候发现有ObjectId.GenerateNewId()的方法提供,我们可以直接调用即可,不需要我们在花费多余的时间设计重写了。
追逐时光者
2023/03/24
1.4K0
.NET生成MongoDB中的主键ObjectId
为什么MySQL不推荐使用uuid作为主键?
在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?关注公种浩:程序员追风,回复012获取一套500多页PDF总结的MySQL学习笔记。
程序员追风
2020/12/29
5.1K0
为什么MySQL不推荐使用uuid作为主键?
MySQL主键约束使用
MySQL主键约束是一种用于确保表中每行数据的唯一性的限制。每个表只能有一个主键,它可以是一个或多个列。
堕落飞鸟
2023/05/11
2.6K0
使用时间戳生成唯一主键
时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。使用数字签名技术产生的数据, 签名的对象包括了原始文件信息、 签名参数、 签名时间等信息。广泛的运用在知识产权保护、 合同签字、 金融帐务、 电子报价投标、 股票交易等方面。
李郑
2019/12/04
4.4K0
序列作为主键使用的原理、优缺点讨论
这几天和同事一直在讨论关于表设计中主键选择的问题,用sequence作为主键究竟有什么好处,又有什么缺点,尤其是有些事务场景上下文需要用到创建的序列值,如何用?其实我想说的是,可能只是一个很简单的概念,可能深入理解,还是有很多未知的知识,当然也就可能会有一些容易忽略但又可能很关键的坑,只有碰了才知道。。。
bisal
2019/01/29
1.1K0
快速学习-JPA中的主键生成策略
通过annotation(注解)来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法。
cwl_java
2020/04/01
1.4K0
数据库主键一定要自增吗?有哪些场景不建议自增?
出于习惯,我们一般会加一列id作为主键,而这个主键一般边上都有个AUTO_INCREMENT, 意思是这个主键是自增的。自增就是i++,也就是每次都加1。
小白debug
2022/06/20
6.6K0
数据库主键一定要自增吗?有哪些场景不建议自增?
MySQL自增主键为什么不连续
可以看到表定义中出现了AUTO_INCREMENT=2,表示下一次插入数据时如果需要自动生成自增值,那么id便是2。
shysh95
2022/04/07
8.4K0
MySQL自增主键为什么不连续
浅谈数据库主键策略
浅谈数据库主键策略 数据库表的主键很多童鞋都非常熟悉了,主键就是Primary Key,简称PK。 数据库主键的作用是唯一标识一条记录,所以在同一张表中,任意一条记录的主键都是唯一的,不然,数据库系统就无法根据主键直接定位记录。 虽然数据库系统本身对主键没有特别的要求,但是,写程序的时候,要考虑清楚使用什么类型的主键。正确地使用主键是存储数据成功的一半,错误地使用主键会让一个应用逐渐走向崩溃。 主键不可修改 对于数据库来说,主键其实是可以修改的,只要不和其他主键冲突就可以。但是,对于应用来说,如
用户1212940
2018/01/23
1.5K0
常见的数据库主键选取方式
1、自动增长字段:   自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。这是我们设置主键的首选:
用户7705674
2021/10/07
1.5K0
数据库模型设计——主键的设计
在数据库设计时,主要就是对实体和关系的设计,实体表现出来就是表,关系表现出来就是外键。而对于一个表,由两部分组成:主键和属性。主键的简单定义就是表中为每一行数据的唯一标识。其实更准确的说法,每一行数据的唯一标识是候选键(Candidate Key),一个表中可以有很多个候选键,主键是候选键中的一个,主要用于更方便的检索和管理数据。一个表中可以有多个候选键,但是只有一个主键。由于主键常常用于检索数据,也用于表之间的关联,所以主键的设计的好坏将会严重影响数据操作的性能。下面来介绍下主键设计的几个考虑因素。
深蓝studyzy
2022/06/16
1.2K0
分布式下规则生成主键
首先,建一张用于存储自增序列的表,相当于所有的按此规则生成主键的表在此都会有对应一条记录。 建表语句: CREATE TABLE PUB_SEQUENCE_NUMBER( prefix VARCHAR(10) NOT NULL PRIMARY KEY COMMENT '前缀(主键)', NAME VARCHAR(30) NOT NULL COMMENT '描述', today char(8) NOT NULL COMMENT '当天日期', minNum INTEGER NOT NULL
小小明童鞋
2018/06/13
1.1K0
淘宝数据库,主键如何设计的?
聊一个实际问题:淘宝的数据库,主键是如何设计的? 某些错的离谱的答案还在网上年复一年的流传着,甚至还成为了所谓的MySQL军规。其中,一个最明显 的错误就是关于MySQL的主键设计。
一个风轻云淡
2022/11/15
1.4K0
淘宝数据库,主键如何设计的?

相似问题

即使禁用主键,也不能从CDC的表中删除主键

17

数据库主键必须是整数吗?

64

主键必须使用EFCode调用"Id“吗?

22

聚合间引用必须使用主键吗?

32

Hibernate不使用PostgreSQL序列生成主键

41
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文