主键:用于唯一标识一个表中一行数据。

外键:用于建立两个表之间的关系,A表中有一列是B表中的主键,那么A表中这列的数据就受到B表主键的约束。

那么关于主键应该如何设计呢,这里我说下优缺点:

1.用自动增长字段作为主键,这样的主键可以称之为 非业务主键(或逻辑主键、或代理主键),就是说这列与业务无关,仅仅是作为主键而设计。

优点:自增长字段往往是integer bigint类型,最多占8个字节。索引与外键 所占用的空间连带减少,增删改查 效率高。业务变化,不影响,不需要更新主键。

缺点:无法转移数据库,比如把表中的一批数据 转移 或 附带到 另一个表中,那么由于是自增长字段,那么会导致无法转移,因为另外一个表可能已经存在部分数据,会造成主键冲突。自增长字段的缺陷。

业务数据的完整性,无法保证。

2.用全球唯一标识符GUID,来做主键。依然是非业务主键。

优点:可以转移数据库。业务变化,不影响,不需要更新主键。

缺点:字符串较长,占用的空间较多,如果用于外键的话,会导致连带其它表占用的空间连带增多。A表中有一列是B表中的主键 ,那么A表中的这列也是需要有个索引的,即存储空间会连带增多。效率变低。

即除了正常业务字段外,还是弄个字符串字段来专一保存这个全球唯一标识符,造成存储浪费。业务数据的完整性,无法保证。

3.用业务字段做主键。

优点:可以转移数据库,最大化节省了空间,因为并没有 多增加一个非业务字段做主键。业务数据的完整性,可以保证。避免产生垃圾数据,银行就是用业务字段做主键的,虽然效率低,但是安全。

缺点:如果业务发生改变,有可能需要修改主键,举例:国家A表用身份证号做主键,然后其他很多表中的身份证号这列都是来自 身份证表A中的主键(即外键),那么如果身份证号升级,比如从1代升级到2代,那么

那么连带的表的外键 的索引 通通都得发生变化,效率极低 因为会连带更新一串用到这个外键的表,可见用业务字段做主键的话,你得保证 主键不经常变化。

==============

综上:用哪种方式做主键,还是得看业务需求,实际情况,实事求是。根据情况选择,没有固定的标准。

转载于:https://www.cnblogs.com/del88/p/6719176.html

关于主键的设计、primary key相关推荐

  1. 主键约束(PRIMARY KEY, PK)

    主键约束(PRIMARY KEY, PK) 主键约束=非空约束+唯一约束.也就是说设置为主键列,不能够为空,不能够重复. 范例:定义主键约束 --删除数据表 DROP TABLE member PUR ...

  2. MySQL主键约束(PRIMARY KEY ,PK)

    MySQL主键约束(PRIMARY KEY ,PK) 在数据库中使用过程中 如果 想将某个字段作为唯一标识,标记所有内容时,则可以使用PK 约束进行设置.即PK约束在创建数据库表时为某些字段加上&qu ...

  3. 主键约束(primary key)

    10.2.1主键约束(primary key) 特点:不能为空,不重复 方式一:创建表,并且添加主键约束 create table stu1( id int primary key, name var ...

  4. mysql getgeneratedkeys,JDBC获得数据库生成的主键(JDBC、Primary Key)

    JDBC获得数据库生成的主键 佟强 http://blog.csdn.net/microtong 在实际开发中,数据库中表的主键经常会由数据库负责生成,INSERT语句插入数据时插入除了主键以外的字段 ...

  5. 主键约束(primary key,简称PK)

    主键约束的相关术语?         主键约束:就是一种约束.         主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段         主键值:主键字段中的每一个值都叫做:主键值. ...

  6. 数据库模型设计——主键的设计

    在数据库设计时,主要就是对实体和关系的设计,实体表现出来就是表,关系表现出来就是外键.而对于一个表,由两部分组成:主键和属性.主键的简单定义就是表中为每一行数据的唯一标识.其实更准确的说法,每一行数据 ...

  7. 分布式主键生成设计策略

    1 写作目的 这几天被虾皮裁员的消息刷屏了,实话实说互联网的行情确实很差,各处都在裁员.而且最近在忙试用期转正答辩,还不错,光荣的成为了一个大厂的正式员工,很庆幸在这么不稳定的情况下还能有自己的一寸方 ...

  8. 主外键constraint、primary key、foreign key、check、default的用法和理解

    alter table table_6 --向已存在的table_6这个表中再添加字段jj\oo\kk这3个字段 add jj varchar(50),oo int,kk int select *fr ...

  9. CHIL-ORACLE-主外键约束(primary key / foreign key)

    主键约束 要求主键列数据唯一,并且不允许为空 外键约束 用于量表建立关系,需要指定引用朱彪的那列(主表必须是主键)1.主键约束 ( primary key )--例如1:create table te ...

最新文章

  1. JavaSript模块化 AMD CMD 详解.....
  2. 在线转flv+flash在线录制视频
  3. 11月3号晚7点中科院南土所梁玉婷报告:土壤微生物功能组学与关键类群识别
  4. access mysql字段对应_ACCESS数据库中表与字段名称修改
  5. 使用 Sealos + Longhorn 部署 KubeSphere v3.0.0
  6. Python编程专属骚技巧1
  7. 整理了90个Pandas案例,强烈建议收藏!
  8. 1.App瘦身经验总结
  9. rabbitmq接收不到消息 防火墙_用PHP+RabbitMQ实现消息的发送和接收
  10. SVN-关于分支创建合并
  11. [转载] 希腊字母读音表
  12. 导图速读《高性能MySQL》
  13. 5G+折叠屏:华为Mate Xs打造多项创新体验
  14. Unity Animator人物模型动画移动偏移
  15. itest手机考试有监控吗_itest考试有声音监控吗?
  16. 什么是Windows驱动程序?
  17. 标准单元库的corner简述
  18. word批注怎么删除计算机名字,word 2007 如何删除批注者姓名?
  19. 学大伟业 Day 1 培训总结
  20. 计算机视觉(十六):目标检测概述

热门文章

  1. rust怎么不要的墙拆掉_封阳台,栏杆要不要拆掉?栏杆装在玻璃窗里面还是外面...
  2. access denied for_abm怎么样?ACCESS集团携8大国际品牌在进博会首秀,展示abmr 硬核实力!...
  3. LQ训练营(C++)学习笔记_栈与递归
  4. java file ip_java常用工具类 IP、File文件工具类
  5. 如何只导出mysql表结构_navicat如何只导出表结构
  6. CSDN移动博文集锦之Android核心分析 (Z)
  7. Servlet3 -- Servlet异步处理
  8. 委内瑞拉通胀这么厉害,为什么有钱人不去圈地、买房?
  9. 历史是“混合体”,也是“内幕”:说说《三国大传》
  10. BRAND-NEW OF DOUBLES工作组合的新作品