如何在数据库中生成串行STRING主键

时间:2009-07-28 15:47:51

标签: database database-design

我的同事不喜欢按数据库自动生成的int序列号,并且想要使用字符串主键,如:

“camera0001” “camera0002”

由于相机可能被删除,我无法使用“相机的总nubmer + 1”作为新相机的ID。

如果你是我,你将如何在你的程序中生成这种密钥?

PS:我认为自动生成的serail号码作为主键是可以的,只是不喜欢与我的同事争论。

3 个答案:

答案 0 :(得分:2)

不要像“camera0001”那样做!争辩说,这是一个可怕的设计错误。

尝试以下其中一项:

数据库中的每列只应包含1条信息。将ID和类型保留在不同的列中。如果您愿意,可以将它们一起显示,但不要将它们存储在一起!您将不得不经常拆分它们并使简单查询变得困难。该字符串将占用磁盘和缓存内存上的大量空间,如果它是FK,它也会浪费空间。

有一个纯数字自动列ID和一个类型列,它是包含描述的表的外键,如:

表1

YourID     int  auto id  PK
YourType   char(1)  fk

TypeTable

 YourType   char(1)  PK
 Description  varchar(100)

表1

YourID  YourType   YourData....
1         C        xyz
2         C        abc
3         R        dffd
4         C        fg

TypeTable

YourType   Description
C          Camera
R          Radio

答案 1 :(得分:1)

我不同意序列号始终是最好的密钥。当有可用的自然主键时,我更喜欢序列号。例如,如果您的相机被一些相当短的型号名称或代码识别出来,就像您在目录中将“Super Duper Professional Camera Model 3”识别为“SDPC3”一样,那么“SDPC3”在我看来是是主键的绝佳选择。

但这听起来不像你的同事想在这里做的那样。他们想要一个产品类别,“相机”,当然没有人期望是独一无二的,然后通过添加序列号使其独特。这给你带来了两个世界中最糟糕的:它很难生成,一个很长的字符串使得处理速度变慢,而且它仍然毫无意义:没有人会记得“camera0002904”是带有蓝色外壳的300万像素相机,而“ camera0002905“是配备红色外壳的400万像素摄像头。无论如何,没有人会记住那种事情。因此,您不会将这些值用作用户的有用显示值。

如果你绝对被迫做这样的事情,我会说两个字段:一个用于类别,一个用于序列号。如果他们希望将它们连接在一起进行展示,那很好。最好使序列号在不同类别中唯一,因此它本身可以是主键,但如果需要,您可以在类别中指定序列号。 MySQL会自动执行此操作;大多数数据库都要求您编写一些代码来执行此操作。 (如果你想讨论如何,再次发布。)哦,我不会有任何人输入“相机”的类别。这应该是合法值的查找表,然后将此查找表的主键发布到产品记录中。否则你将会有“相机”,“相机”和“camrea”以及其他几十个错别字和变种。

答案 2 :(得分:0)

有一个包含序列号计数器的表,增加它并插入记录。

OR

将Id设置为'camera'+ PAD((RIGHT(MAX(ID),4)+ 1),'0',4)