精华内容
下载资源
问答
  • 今天工作,做老项目维护的时候无意发现一张表居然个主键。吓死宝宝了,然后尝试着建表建主键,但是都不能成功。 难道是我写的问题,最后通过查资料总终于解决了。 1、数据库的每张表只能个主键,不...

    今天在工作,做老项目维护的时候无意中发现一张表居然有三个主键。吓死宝宝了,然后尝试着建表建主键,但是都不能成功。疑问

    难道是我写的有问题,最后通过查资料总终于解决了。

    1、数据库的每张表只能有一个主键,不可能有多个主键。

    2、所谓的一张表多个主键,我们称之为联合主键。

         注:联合主键:就是用多个字段一起作为一张表的主键。

    3、主键的主键的作用是保证数据的唯一性和完整性,同时通过主键检索表能够增加检索速度。

     

    下面聊聊怎么创建联合主键:

     

    1、GUI中同时选中多列,点击设置为主键。

    2、sql语句将多列设置为主键:

     

     一种是在建表时就写出,语句如下:

    Create Table 表名 (字段名1 Int Not Null,
                       字段名2 nvarchar(13) Not Null Primary Key (字段名1, 字段名2),
                        字段名3…………
                        字段名N………… )

    另一种是在建表后更改,语句如下:

    ALTER TABLE 表名 WITH NOCHECK ADD 
    CONSTRAINT [PK_表名] PRIMARY KEY  NONCLUSTERED 
    (
      [字段名1],
      [字段名2]
    )
     
    通过以上两种方式就解决了联合主键的问题。

    --------------------- 本文来自 牟鹏 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/for12/article/details/49300843?utm_source=copy

    展开全文
  • 数据库个主键(联合主键)

    千次阅读 2017-09-04 10:47:51
    创建某表,需要两个主键(INST_ID,INST_RESP_CODE) CREATE TABLE CODE_CONVERTER_20170806 ( INST_ID CHARACTER(4) NOT NULL, INST_RESP_CODE VARCHAR(32) NOT NULL, TRANS_CODE VARCHAR(8) NOT NULL, INST_...

    创建某表,需要两个主键(INST_ID,INST_RESP_CODE)

    CREATE TABLE CODE_CONVERTER_20170806 (
    	INST_ID CHARACTER(4) NOT NULL,
    	INST_RESP_CODE VARCHAR(32) NOT NULL,
    	TRANS_CODE VARCHAR(8) NOT NULL,
    	INST_RESP_MSG VARCHAR(128),	
    	RESV1 VARCHAR(32),
    	RESV2 VARCHAR(64),
    	PRIMARY KEY (INST_ID, INST_RESP_CODE)
    ) 
    COMMENT ON TABLE CODE_CONVERTER IS '响应码转换表';
    COMMENT ON COLUMN CODE_CONVERTER.INST_ID IS '机构编号';
    COMMENT ON COLUMN CODE_CONVERTER.INST_RESP_CODE IS '机构的返回码';
    COMMENT ON COLUMN CODE_CONVERTER.TRANS_CODE IS '交易码';
    COMMENT ON COLUMN CODE_CONVERTER.INST_RESP_MSG IS '机构的返回消息';
    COMMENT ON COLUMN CODE_CONVERTER.RESV1 IS '保留域1';
    COMMENT ON COLUMN CODE_CONVERTER.RESV2 IS '保留域2';
    


    展开全文
  • 天对逻辑主键、业务主键和复合主键进行了一些思考,也网上搜索了一下相关的讨论,相关讨论可以看最下面的参考链接。下面是自己基于 SQL Server 做的一些总结,其他数据库(Oracle、MySQL、DB2、......)应该也...

    关于业务主键和逻辑主键的思考

    这几天对逻辑主键、业务主键和复合主键进行了一些思考,也在网上搜索了一下相关的讨论,相关讨论可以看最下面的参考链接。下面是自己基于 SQL Server 做的一些总结,其他数据库(Oracle、MySQL、DB2、......)应该也类似吧。这个只是自己一时的思考,如有不当请告知,重新思考后再修正。

    定义(部分定义来源于 SQL Server 联机丛书):

    主键(PRIMARY KEY):表通常具有包含唯一标识表中每一行的值的一列或一组列。这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。

    外键(FOREIGN KEY):外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两表之间创建了链接。这个列就成为第二个表的外键。

    聚集索引:聚集索引基于数据行的键值在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。

    非聚集索引:非聚集索引包含索引键值和指向表数据存储位置的行定位器。可以对表或索引视图创建多个非聚集索引。通常,设计非聚集索引是为改善经常使用的、没有建立聚集索引的查询的性能。

    自动编号列和标识符列:对于每个表,均可创建一个包含系统生成的序号值的标识符列,该序号值以唯一方式标识表中的每一行。

    业务主键(自然主键):在数据库表中把具有业务逻辑含义的字段作为主键,称为“自然主键(Natural Key)”。

    逻辑主键(代理主键):在数据库表中采用一个与当前表中逻辑信息无关的字段作为其主键,称为“代理主键”。

    复合主键(联合主键):通过两个或者多个字段的组合作为主键。

     

    原理分析:

    使用逻辑主键的主要原因是,业务主键一旦改变则系统中关联该主键的部分的修改将会是不可避免的,并且引用越多改动越大。而使用逻辑主键则只需要修改相应的业务主键相关的业务逻辑即可,减少了因为业务主键相关改变对系统的影响范围。业务逻辑的改变是不可避免的,因为“永远不变的是变化”,没有任何一个公司是一成不变的,没有任何一个业务是永远不变的。最典型的例子就是身份证升位和驾驶执照号换用身份证号的业务变更。而且现实中也确实出现了身份证号码重复的情况,这样如果用身份证号码作为主键也带来了难以处理的情况。当然应对改变,可以有很多解决方案,方案之一是做一新系统与时俱进,这对软件公司来说确实是件好事。

    使用逻辑主键的另外一个原因是,业务主键过大,不利于传输、处理和存储。我认为一般如果业务主键超过8字节就应该考虑使用逻辑主键了,因为int是4字节的,bigint是8字节的,而业务主键一般是字符串,同样是 8 字节的 bigint 和 8 字节的字符串在传输和处理上自然是 bigint 效率更高一些。想象一下 code == "12345678" 和 id == 12345678 的汇编码的不同就知道了。当然逻辑主键不一定是 int 或者 bigint ,而业务主键也不一定是字符串也可以是 int 或 datetime 等类型,同时传输的也不一定就是主键,这个就要具体分析了,但是原理类似,这里只是讨论通常情况。同时如果其他表需要引用该主键的话,也需要存储该主键,那么这个存储空间的开销也是不一样的。而且这些表的这个引用字段通常就是外键,或者通常也会建索引方便查找,这样也会造成存储空间的开销的不同,这也是需要具体分析的。

    使用逻辑主键的再一个原因是,使用 int 或者 bigint 作为外键进行联接查询,性能会比以字符串作为外键进行联接查询快。原理和上面的类似,这里不再重复。

    使用逻辑主键的再一个原因是,存在用户或维护人员误录入数据到业务主键中的问题。例如错把 RMB 录入为 RXB ,相关的引用都是引用了错误的数据,一旦需要修改则非常麻烦。如果使用逻辑主键则问题很好解决,如果使用业务主键则会影响到其他表的外键数据,当然也可以通过级联更新方式解决,但是不是所有都能级联得了的。

    使用业务主键的主要原因是,增加逻辑主键就是增加了一个业务无关的字段,而用户通常都是对于业务相关的字段进行查找(比如员工的工号,书本的 ISBN No. ),这样我们除了为逻辑主键加索引,还必须为这些业务字段加索引,这样数据库的性能就会下降,而且也增加了存储空间的开销。所以对于业务上确实不常改变的基础数据而言,使用业务主键不失是一个比较好的选择。另一方面,对于基础数据而言,一般的增、删、改都比较少,所以这部分的开销也不会太多,而如果这时候对于业务逻辑的改变有担忧的话,也是可以考虑使用逻辑主键的,这就需要具体问题具体分析了。

    使用业务主键的另外一个原因是,对于用户操作而言,都是通过业务字段进行的,所以在这些情况下,如果使用逻辑主键的话,必须要多做一次映射转换的动作。我认为这种担心是多余的,直接使用业务主键查询就能得到结果,根本不用管逻辑主键,除非业务主键本身就不唯一。另外,如果在设计的时候就考虑使用逻辑主键的话,编码的时候也是会以主键为主进行处理的,在系统内部传输、处理和存储都是相同的主键,不存在转换问题。除非现有系统是使用业务主键,要把现有系统改成使用逻辑主键,这种情况才会存在转换问题。暂时没有想到还有什么场景是存在这样的转换的。

    使用业务主键的再一个原因是,对于银行系统而言安全性比性能更加重要,这时候就会考虑使用业务主键,既可以作为主键也可以作为冗余数据,避免因为使用逻辑主键带来的关联丢失问题。如果由于某种原因导致主表和子表关联关系丢失的话,银行可是会面临无法挽回的损失的。为了杜绝这种情况的发生,业务主键需要在重要的表中有冗余存在,这种情况最好的处理方式就是直接使用业务主键了。例如身份证号、存折号、卡号等。所以通常银行系统都要求使用业务主键,这个需求并不是出于性能的考虑而是出于安全性的考虑。

    使用复合主键的主要原因和使用业务主键是相关的,通常业务主键只使用一个字段不能解决问题,那就只能使用多个字段了。例如使用姓名字段不够用了,再加个生日字段。这种使用复合主键方式效率非常低,主要原因和上面对于较大的业务主键的情况类似。另外如果其他表要与该表关联则需要引用复合主键的所有字段,这就不单纯是性能问题了,还有存储空间的问题了,当然你也可以认为这是合理的数据冗余,方便查询,但是感觉有点得不偿失。

    使用复合主键的另外一个原因是,对于关系表来说必须关联两个实体表的主键,才能表示它们之间的关系,那么可以把这两个主键联合组成复合主键即可。如果两个实体存在多个关系,可以再加一个顺序字段联合组成复合主键,但是这样就会引入业务主键的弊端。当然也可以另外对这个关系表添加一个逻辑主键,避免了业务主键的弊端,同时也方便其他表对它的引用。

    综合来说,网上大多数人是倾向于用逻辑主键的,而对于实体表用复合主键方式的应该没有多少人认同。支持业务主键的人通常有种误解,认为逻辑主键必须对用户来说有意义,其实逻辑主键只是系统内部使用的,对用户来说是无需知道的。

    结论或推论:

    1、尽量避免使用业务主键,尽量使用逻辑主键。

    2、如果要使用业务主键必须保证业务主键相关的业务逻辑改变的概率为0,并且业务主键不太大,并且业务主键不能交由用户修改。

    3、除关系表外,尽量不使用复合主键。

    使用逻辑主键的最佳实践指南:

    1、足够用就好。系统使用的生命周期以100年为限,逻辑主键数据类型采用下表规则,如果不确定则使用int类型。

    数据量数据类型数据大小生成频率备注
    < 128tinyint1 字节1条/年频率过低,不太靠谱,不建议采用
    < 3 万smallint2 字节27条/月频率较低,慎用
    < 21 亿int4 字节40条/分钟能满足大部分情况
    < 922 亿亿bigint8 字节292万条/毫秒能满足绝大部分情况 
    >= 922 亿亿uniqueidentifier16 字节

    100亿用户同时每毫秒生成10亿条,可以连续生成10亿年

    可用于分布式、高并发的应用

    2、一般采用自增长方式或NewID()方式。

    3、主键字段名称一般采用“表名ID”方式,方便识别和表联接。

    4、如果表存在分布式应用,则可以考虑采用不同起始值,相同步长方式自增。例如有3个部署在不同地方的库,则可以如下设计:

    起始值步长
    110
    210
    310

    步长统一设置10是为了方便日后扩展,这样不同库之间也能保持主键唯一性了,也方便合并。

    5、如果存在高并发性需求或数据表迁移需求,可以考虑使用uniqueidentifier类型,并使用NewID()函数。

    6、可以考虑对业务主键建立唯一性索引,以实现业务主键唯一性的业务需求。

    7、如果需要考虑业务主键的性能需求,可以把业务主键建立聚集索引,而逻辑主键只建立主键约束和非聚集索引即可。

    8、关系表可以考虑采用复合主键方式,复合主键不用于实体表。

    参考:https://www.cnblogs.com/sparkbj/p/6015690.html

    展开全文
  • 其中stock_dismantle的后两字段都是从stock_info的主键id获取的,那么这时连表查询怎样才能同时找到stock_id_first和stock_id_second对应的stock_info里的信息呢? 要连两次表,并给表起别名 SELECT stock_...

    现在这里有两个表:
    stock_dismantle
    在这里插入图片描述
    stock_info
    在这里插入图片描述
    其中stock_dismantle中的后两个字段都是从stock_info的主键id中获取的,那么这时连表查询怎样才能同时找到stock_id_first和stock_id_second对应的stock_info里的信息呢?
    要连两次表,并给表起别名

    left JOIN stock_infor AS t1 ON stock_dismantle.stock_id_first = t1.id
    left JOIN stock_infor AS t2 ON stock_dismantle.stock_id_second = t2.id
    
    SELECT
    	stock_dismantle.id,
    	stock_dismantle.stock_id_first,
    	stock_dismantle.stock_id_second,
    	(
    		SELECT
    			t1.original_barcode
    		WHERE
    			t1.id = stock_dismantle.stock_id_first
    	) AS aCode,
    	(
    		SELECT
    			t2.original_barcode
    		WHERE
    			t2.id = stock_dismantle.stock_id_second
    	) AS bCode,
    	(
    		SELECT
    			t1.stock_name
    		WHERE
    			t1.id = stock_dismantle.stock_id_first
    	) AS aName,
    	(
    		SELECT
    			t2.stock_name
    		WHERE
    			t2.id = stock_dismantle.stock_id_second
    	) AS bName,
    (
    		SELECT
    			t1.stock_num
    		WHERE
    			t1.id = stock_dismantle.stock_id_first
    	) AS aNum,
    	(
    		SELECT
    			t2.stock_num
    		WHERE
    			t2.id = stock_dismantle.stock_id_second
    	) AS bNum
    FROM
    	`stock_dismantle`
    left JOIN stock_infor AS t1 ON stock_dismantle.stock_id_first = t1.id
    left JOIN stock_infor AS t2 ON stock_dismantle.stock_id_second = t2.id
    

    得到如下结果:
    在这里插入图片描述

    展开全文
  • 最近学习一点数据库的基本知识,被一个问题困惑了许久:主键是唯一的索引,那么为何一个表可以创建多个主键呢? 其实“主键是唯一的索引”这话有点歧义的。举个例子,我们创建了一个ID字段,自动增长,并设为...
  • 一张表可以有多少个主键

    万次阅读 2018-10-24 09:47:39
    今天学习sql语句的时候看到一张表建立的时候个主键,印象中一张表主键...1、数据库的每张表只能个主键,不可能个主键。 2、所谓的一张表多个主键,我们称之为联合主键。  注:联合主键:就是用多...
  • 主键的生成方式主要三种: 一. 数据库自动生成 二. GUID 三. 开发创建 严格讲这三种产生方式一定的交叉点,其定位方式将下面进行讲解。 第一种方式,主要将其定位自增长的标识种子:可以设置起始数值,及...
  • 数据库面试

    千次阅读 多人点赞 2019-02-13 09:03:42
    一、数据库问答题 1. SQL语言包括哪些类型? 数据定义DDL:Create Table,Alter Table,Drop Table, Create/Drop Index等 ...内连接是保证两所有的行都要满足连接条件,而外连接则不然。 在外连接...
  • 数据库中几个基本概念 主码 外码

    万次阅读 多人点赞 2015-07-17 10:20:22
    关系(表),主码不一定只有一,但是一定要的。因为元组,是对世界某种事物的数据描述,而世界各种事物,都具有唯一性,都是可以区分的。计算机为了描述事物的唯一性,引入了主码的概念。...
  • 数据库中主键与外键的关系,通俗易懂

    万次阅读 多人点赞 2017-12-16 16:13:08
    关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如学生表(学号,姓名,性别,班级)其中每个学生的学号是唯一的,学号就是一个主键课程表...
  • PK数据库 联合主键和自增主键

    千次阅读 2019-01-09 14:56:57
    主键主键是用来干嘛的?一般来说是为了建立唯一标识,建立索引...主键的设置方法3种: 一种是设置自增长主键,第二种是采用业务主键,第三种是生成唯一序列(使用uuid/guid); 如何选择主键设置方式: 必须按情况来...
  • 主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表最多只能个主键,主 键所在的列通常是整数类型。 一个可能被忽略的问题:数据库必须主键吗? 答案是否定的。数据库中的...
  • 数据库主键设计

    2019-02-20 10:02:35
    数据库主键
  • 关于数据库中主键的自动增长

    千次阅读 2018-11-08 19:44:15
    &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;... Mysql、SqlServer、Oracle主键自动增长的设置 ...1、把主键定义为自动增长标
  • 关于数据库主键和外键(终于弄懂啦)

    万次阅读 多人点赞 2019-06-18 15:59:59
    转 关于数据库主键和外键(终于弄懂啦) 2018年07月16日 19:44:24 f45056231p 阅读数 19385 ...
  • mysql查询数据库中各表的主键、自增标识
  • 数据库主键的生成方式介绍

    千次阅读 2017-07-01 12:22:11
    increment(递增) 用于为long, short或者int类型...只有没有其他进程往同一张表插入数据时才能使用。 集群下不要使用。  identity 对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识
  • 关于数据库主键和外键,索引

    千次阅读 2018-06-28 18:18:29
    关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 ...
  • 前面和大家介绍了 MyCat 中数据库不同的分片规则,从留言看出大家对分布式数据库中间件还挺感兴趣,因此今天就再来一篇,聊一聊主键全局自增要如何实现。关于数据库分库分表...
  • 数据库复合主键

    千次阅读 2018-03-28 17:57:29
    主键是唯一的索引,那么为何一个表可以创建多个主键呢?其实“主键是唯一的索引”这话有点歧义的。举个例子,我们创建了一个ID字段,自动增长,并设为主键,这个是没有问题的,因为“主键是唯一的索引”,ID...
  • sql新建数据库表,及添加多个主键

    千次阅读 2016-09-27 14:05:00
    create table tb_Modules(module_Id int identity(1,1) primary key, (自增)model_Name varchar(50) not null,page_Id int foreign key(page_Id) references tb_Page(page_Id)...(当然的时候根据实际求也会...
  • 今天写项目的时候遇到了一个棘手的问题,我利用hibernate从数据库反向生成实体类的时候,数据库中有个主键的表反向生成的时候会出现俩个实体类, 顿时我就懵了,我查看了很多的资料,上面都说是缺少主键或者是...
  • 数据库主键设计原则

    万次阅读 2017-07-08 10:52:49
    阅读《阿里 Java 开发手册》时,以下 MySQL 建表规约: 表必备三字段:id, gmt_create, gmt_modified。 说明:其中id必为主键,类型为unsigned bigint、单表时自增、步长为1。gmt_create, gmt_modified的类型均...
  • 数据库主键生成方案

    千次阅读 2018-04-19 22:23:48
    问题产生的背景:数据量到达一定程度时,需要做数据的分库分表(这又是一很值得讨论的问题,什么量级的数据做分库分表),此时我们需要保证数据库主键的唯一性、单调递增。并且获取唯一主键的服务要保证高可用、高...
  • MySQL 数据库主键的策略

    千次阅读 2018-04-19 13:17:21
    这是GUID最大的优势,也方便数据导入,比如要求从另一系统把数据导入进来,那么,不用担心,导入时,会导致主键冲突.不足是GUID值太复杂.不易记忆,因为有时,难免我们会用记录的方式,来进行记录判断.而且数据太长,影响...
  • 数据库主键生成方式分析

    千次阅读 2017-05-27 16:47:40
    最近自己做一javaWeb项目,使用的SpringMVC+...目前数据库用的mysql,对于主键生成采用那一种方法很是头疼,目前生成主键方法主要以下种:   1、采用mysql自增长主键策略   :简单,不需要程序特别处理

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 190,567
精华内容 76,226
关键字:

在数据库中可以有几个主键