我想创建一些人性化的代码来识别我的对象。
我正在考虑使用以下规则:
我希望我的MS SQL数据库强制我使用的代码不仅是唯一的,而且也符合上述标准。
我如何编写数据库检查约束来强制执行这些规则?
如何让数据库使用这些数字作为插入行的默认值?
**因此,单击键错误不会检索不同于预期的记录*
答案 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。