数据库生成的人类友好代码

时间:2009-05-08 21:33:36

标签: sql-server random

我想创建一些人性化的代码来识别我的对象。

我正在考虑使用以下规则:

  • 6位数随机数
  • 第一个字符不为零
  • 每个代码的edit distance值为2或更大*来自其他所有代码
  • 也许是校验和

我希望我的MS SQL数据库强制我使用的代码不仅是唯一的,而且也符合上述标准。

我如何编写数据库检查约束来强制执行这些规则?

如何让数据库使用这些数字作为插入行的默认值?

**因此,单击键错误不会检索不同于预期的记录*

6 个答案:

答案 0 :(得分:1)

使用存储过程检查插入数据的任何约束。

如果需要,还可以使用存储过程生成这些内容。

虽然让数据库为你做这一切似乎是件好事,但从长远来看,在代码中完成这一切可以更容易维护(除非你有专门的DBA喜欢维护这类东西)。

我认为你的想法和算法很聪明。如果你要满足要求那么远,我会说校验和是一件好事。无论编辑距离如何,单独的校验和可以捕获拼写错误。

答案 1 :(得分:1)

创建一个计算数值的存储过程;将该存储过程用作表定义中列定义的DEFAULT()值。注意:我没试过这个,所以我不知道它是否完全可能。

答案 2 :(得分:1)

你需要多少个id?

您可以将列声明为标识,并将起始值设置为100000,将增量设置为12.这将生成一个六位数字,编辑距离为2.

另外,作为奖励,这是非常快的。但是你可能会用尽数字,因为这并不是那么密集。

CREATE TABLE [Items]
(
    [id] int IDENTITY(100000,12) NOT NULL primary key,
    [Data] varchar(50) NULL
)

答案 3 :(得分:1)

就UI而言你的敌人是代码长度。我建议你添加字母字符(省略零,哦,一个和眼睛)。它会大幅削减长度,并且不太可能发生碰撞,特别是对于换位。

答案 4 :(得分:0)

编写一次性使用程序,使用整数主键以加扰顺序填充所有(或许多)可能有效代码的表。

代码表:

Id   HumanFriendlyCode

1    100124
2    991302
3    201463
4    157104
...  ...

然后将对象表与该代码表中的行相关联,并使用自动递增的整数外键和唯一约束。

事情表:

Id                                    CodeId  ...

e9d29b14-0ea6-4cfd-a49f-44bcaa7212eb  1       ...
91906bb7-14ed-4acc-bf23-c4bd1631797f  2       ...
41ace075-f9f8-46b7-b114-cb17765c4e76  3       ...
2fba1a58-7a91-4da6-a4a2-7cacef8603db  4       ...

有人做过这样的事吗?

答案 5 :(得分:0)

此检查约束将在数据库列中强制执行校验和:

ALTER TABLE tblCode
ADD CHECK (
    CAST(SUBSTRING(CAST(Code AS VARCHAR), 6, 1) AS INTEGER) =
    (
        CAST(SUBSTRING(CAST(Code AS VARCHAR), 1, 1) AS INTEGER) +
        CAST(SUBSTRING(CAST(Code AS VARCHAR), 2, 1) AS INTEGER) +
        CAST(SUBSTRING(CAST(Code AS VARCHAR), 3, 1) AS INTEGER) +
        CAST(SUBSTRING(CAST(Code AS VARCHAR), 4, 1) AS INTEGER) +
        CAST(SUBSTRING(CAST(Code AS VARCHAR), 5, 1) AS INTEGER)
    ) % 10
)

第六位数字必须是前五位数之和的10。