一般来说关系型数据库,绝大多数表都有数据库主键。
数据库主键的创建,一般有如下几种形式:
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 table tablename ( colname serial );//等价于CREATE SEQUENCE tablename_colname_seq;CREATE TABLE tablename ( colname integer NOT NULL DEFAULT nextval('tablename_colname_seq'));ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
自增长数据库主键,一般是 int/long 之类的整数/长整数。理论上有数据最大容量限制。
在 java/c# 代码中,可将这种主键字段,转换为 long.
2. 使用数据库的 GUID/UUID 之类的语法。
一般是数据字段类型 + 数据库内置函数设置默认值,来定义一个列。
以下是 MS SQL Server 示例:
CREATE TABLE dbo.Globally_Unique_Data( GUID UNIQUEIDENTIFIER CONSTRAINT Guid_Default DEFAULT NEWSEQUENTIALID() ROWGUIDCOL, Employee_Name VARCHAR(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 KEY CLUSTERED ( [process_request_uuid] ASC);
C# 生成 uuid 的代码示例:
string fileUuid = System.Guid.NewGuid().ToString();
Java 生成 uuid 的代码示例如下:
public String createUuid() { return UUID.randomUUID().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 TABLE dbo.Department( xxx VARCHAR(10) NOT NULL PRIMARY KEY NONCLUSTERED, ...);
然后再加 CLUSTERED INDEX ,来解决此问题。
CREATE CLUSTERED INDEX IX_TestTable_TestCol1 ON dbo.TestTable (TestCol1);
当然,如果表的数据量很少,也可以既没有 CLUSTERED key、 也没有 CLUSTERED index 的。
===============欢迎转载,转载请注明出处:https://www.cnblogs.com/jacklondon/
原文转载:http://www.shaoqun.com/a/477511.html
acca是什么:https://www.ikjzd.com/w/1370
acedota:https://www.ikjzd.com/w/2070
亚马逊高级运营之选品篇-1:https://www.ikjzd.com/tl/1969
Search Terms怎么写?亚马逊Search Terms关键词设置技巧:https://www.ikjzd.com/home/106567
价值几千,Amazon亚马逊侵权申诉全流程+模板,从此不求人,分享给大家:https://www.ikjzd.com/tl/5654
一般来说关系型数据库,绝大多数表都有数据库主键。数据库主键的创建,一般有如下几种形式:1.使用数据库自增长主键的语法。有些数据库,比如MSSQLServer,MySQL,都有对应的语法,可以在创建数据库表的时候,指定某个字段为自增长主键。Oracle,PostgreSQL则使用sequence,来达到类似的作用。一般来说关系型数据库,绝大多数表都有数据库主键。数据库主键的创建,一般有如下几种形式:
tineye:https://www.ikjzd.com/w/448
zen cart:https://www.ikjzd.com/w/1282
WHO官方定心丸:接收来自中国的信件或包裹是安全的!:https://www.ikjzd.com/home/115238
同样是做跨境电商,为什么就你挣不到钱?:https://www.ikjzd.com/home/118288
鲸尸爆炸之谜揭开 源自分解气体自寻出路:http://tech.shaoqun.com/a/25678.html
No comments:
Post a Comment