2023年7月13日发(作者:)
mysql主键有⼏种_关系型数据库的⼏种常⽤主键⼀般来说关系型数据库,绝⼤多数表都有数据库主键。数据库主键的创建,⼀般有如下⼏种形式:1. 使⽤数据库⾃增长主键的语法。有些数据库,⽐如 MS SQL Server, MySQL ,都有对应的语法,可以在创建数据库表的时候,指定某个字段为⾃增长主键。Oracle ,PostgreSQL 则使⽤ sequence , 来达到类似的作⽤。以下是 MS SQL Server ⽰例:create table tb(id int identity(1,1) primary key );以下是 PostgreSQL ⽰例://serial 并不是psql的类型,只是⼀个宏,create tabletablename ( colname serial );//等价于CREATESEQUENCE tablename_colname_seq;CREATE TABLEtablename (colnameinteger NOT NULL DEFAULT nextval('tablename_colname_seq'));ALTER SEQUENCE tablename_colname_seq OWNED BY e;⾃增长数据库主键,⼀般是 int/long 之类的整数/长整数。理论上有数据最⼤容量限制。在 java/c# 代码中,可将这种主键字段,转换为 long.2. 使⽤数据库的 GUID/UUID 之类的语法。⼀般是数据字段类型 + 数据库内置函数设置默认值,来定义⼀个列。以下是 MS SQL Server ⽰例:CREATE ly_Unique_Data(GUIDUNIQUEIDENTIFIERCONSTRAINT Guid_Default DEFAULTNEWSEQUENTIALID()ROWGUIDCOL,Employee_NameVARCHAR(60)CONSTRAINT Guid_PK PRIMARY KEY(GUID));在 java/c# 代码中,可将这种主键字段,转换为 string.3. 使⽤字符串作为表主键,在java/c# 代码中⽣成 uuid ,填充数值。以下是 MS SQL Server ⽰例:CREATE TABLE [dbo].[tt_process_request]([process_request_uuid] [varchar](40) NOT NULL,...[created_time] [datetime] NULL,[created_by] [varchar](50) NULL,[updated_time] [datetime] NULL,[updated_by] [varchar](50) NULL,[updated_cnt] [bigint] NULL,CONSTRAINT [PK_tt_process_request] PRIMARY KEYCLUSTERED([process_request_uuid] ASC);C# ⽣成 uuid 的代码⽰例:string fileUuid = d().ToString();Java ⽣成 uuid 的代码⽰例如下:publicString createUuid() {return UUID().toString().replaceAll("-", "");}代码⽣成的 uuid, 中间有 - 分割数据,可以保留,也可以替换/去掉。4. 使⽤字符型字段作为数据库表主键,对应某个业务数据。⽐如合同号: PS21152357。这类数据中,往往其中的某⼏位,有⼀定的业务业务含义,⽐如,此处 "PS" 为合同号的标识。其它位数,为顺序号。需要编写 在 java/c# 代码中,来⽣成这种编号,并做并发防范。总结:⽅法4 , ⼀般称之为“业务主键”。对应的, 1-3 为“逻辑主键”。总体⽽⾔,应尽量避免使⽤“业务主键”。因为使⽤这种主键,有时并⾮系统⾃动⽣成,⽽是⼈⼯录⼊(⽐如,数据源头在 ERP,现要在另⼀个系统中录⼊数据),⼈⼯录⼊存在⼀定的出错⼏率,如果录⼊出错需要更改主键数据,则外键也要⼀并更改,往往⽐较⿇烦。1-3 的三种“逻辑主键”,我更倾向于第三种。⽅法3" 使⽤字符串作为表主键,在java/c# 代码中⽣成 uuid ,填充数值",不⽤考虑不同数据库间的差异,可以认为任何数据库都⽀持。使⽤起来也简单。如果是使⽤⾃动⽣成代码⼯具,要看情况吧。可能有的⼯具,处理不了。我⾃⼰编写的⼯具,处理起来没问题。⾄于 uuid 字段串,占⽤磁盘空间,⽐⾃增长整数/长整数占⽤的⼤的问题,其实我觉得并不是⼤问题。这不会导致整个系统,磁盘空间需求,增加 1/4 或更多。⼀般可以忽略。另,数据库主键的定义,在某些数据库中,往往会⾃动带上"按此字段进⾏顺序存储"之类的语法。⽐如,SQL Server ,以下是⽰例:CREATE TABLE [dbo].[tt_process_request]([process_request_uuid] [varchar](40) NOT NULL,...,CONSTRAINT [PK_tt_process_request] PRIMARY KEY CLUSTERED([process_request_uuid] ASC)) ;这可以通过更改创建表的 SQL, 使⽤ PRIMARY KEY NONCLUSTERED语法CREATE ment(xxxVARCHAR(10) NOT NULL PRIMARY KEY NONCLUSTERED,...);然后再加 CLUSTERED INDEX ,来解决此问题。CREATE CLUSTERED INDEXIX_TestTable_TestCol1ON ble (TestCol1);当然,数据库表也可以既没有 CLUSTERED key、 也没有 CLUSTERED index 。这种情况下,表的数据存储,按 insert 的时间顺序,从先到后。⼤多数情况下,这种数据存放⽅式,是可以接受的。数据显⽰时,再按照某个时间字段(交易数据, ⽐如销售单的销售时间),或者业务数据主键(主数据/系统配置等),进⾏查询排序,查询到排序后的数据,显⽰给⽤户。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689249858a225756.html
评论列表(0条)