abe*_*ger 5 t-sql math primary-key uniqueidentifier composite-key
由于与问题没有太大关系的各种原因,我有一个带有由两个整数组成的复合键的表,我想从这两个数字中创建一个唯一的键.我最初的想法只是将它们连接起来,但是当我意识到(51,1)的复合键会产生与(5,11)相同的唯一键时,我很快就遇到了问题,即511.
有没有人有一种聪明的方法来生成两个整数中的整数,这样生成的整数对于一对起始整数是唯一的?
编辑:在面对令人印象深刻的数学后,我意识到我应该包括的一个细节是有问题的键的大小.在始发对中,第一个密钥当前是6位数,并且在系统的生命周期中可能保持7位数; 第二个关键还没有超过20个.鉴于这些限制,看起来问题就不那么令人生畏了.
rec*_*ive 21
如果您希望生成的密钥包含与其两个组件相同的位数,则可以在数学上证明这是不可能的.但是,如果你从两个32位整数开始,并且可以使用64位int作为结果,你显然可以这样做:
key1 << 32 | key2
Run Code Online (Sandbox Code Playgroud)
这已经在相当多的细节中进行了讨论(正如递归所说,但是,输出必须包含比单个输入更多的位)。
http://en.wikipedia.org/wiki/Cantor_pairing_function#Cantor_pairing_function
乘以一个足够高的值
SELECT id1 * 1000000 + id2
Run Code Online (Sandbox Code Playgroud)
或者使用文本连接:
SELECT CAST(CAST(id1 AS nvarchar(10)) + RIGHT('000000' + CAST(id2 AS nvarchar(10)), 6) AS int)
Run Code Online (Sandbox Code Playgroud)
或者跳过整数并用非数字分隔 ID:
SELECT CAST(id1 AS nvarchar) + ':' + CAST(id2 AS nvarchar)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7516 次 |
| 最近记录: |