Sql 如何阻止13的倍数出现在标识列中

Sql 如何阻止13的倍数出现在标识列中,sql,Sql,假设我有下表: Create Table Comments ( ID Int Identity(1,1) Not Null Primary Key Clustered, Comment Text Not Null ) 既然我迷信,我怎么才能阻止13的倍数出现在ID列中?即:跳过13、26、39等 非常感谢MySQL或MSSQL中的解决方案。每次序列中出现13n-1时,创建一个触发器以跳到下一个触发器 Create Table Comments ( ID Int

假设我有下表:

Create Table Comments (
    ID Int Identity(1,1) Not Null Primary Key Clustered,
    Comment Text Not Null
)
既然我迷信,我怎么才能阻止13的倍数出现在ID列中?
即:跳过13、26、39等


非常感谢MySQL或MSSQL中的解决方案。

每次序列中出现13n-1时,创建一个触发器以跳到下一个触发器

Create Table Comments (    
    ID Int Identity(2,2) Not Null Primary Key Clustered,    
    Comment Text Not Null
)
布拉德,这是给你的。在不了解SQL Server的情况下,我将在Oracle中执行此操作。似乎是SQL Server中触发器的良好参考

CREATE OR REPLACE TRIGGER trigname 
  AFTER INSERT ON Comments
  FOR EACH ROW 
  IF (:new.ID % 13 = 12) THEN
    -- increase the sequence
    SELECT comment_ID_sequence.NEXTVAL FROM dual;
  END IF;   
END;

如果不进行实际测试,这可能不起作用,但是通过少量的尝试和错误,您可以让它工作。Oracle的sequence对象根本不与表绑定,如果需要,您可以整天对sequence进行碰撞,而无需触摸表。我不知道这在SQL Server中是否正确。

编辑:前面的答案完全错误

您可以这样做:

Identity(1, 13)
由以下人员测试:

for (int i = 1; i < 10000000; i += 13)
{
    if (i % 13 == 0)
    {
        Console.WriteLine(i);
    }
}
for(int i=1;i<10000000;i+=13)
{
如果(i%13==0)
{
控制台写入线(i);
}
}

从1开始递增13永远不会得到13的倍数,至少是1000万的倍数。

在插入时创建触发器

当插入13减1(12、25、38等)的倍数时,立即插入并删除另一行

类似的内容(可能需要修改):

身份(79194966)

这返回了32位整数内的432'436个唯一ID,没有一个是13的倍数

更多对:

171040-产生2'064'889个值

17559-产生3'841'653个值

[编辑]要测试的小型python程序:

import sys

def x(start, step):
    count = 0
    i = start
    N = 1 << 31
    while i < N:
        #print i
        if i % 13 == 0:
            break
        i += step
        count += 1
    print i, i/13.0, count

if __name__ == '__main__':
    x(int(sys.argv[1]), int(sys.argv[2]))
导入系统 def x(开始,步骤): 计数=0 i=开始

N=1 Aww人。这可能是元问题的一个极端例子,但这是一个有趣的问题。也许他是在利用这个身份作为赌博网站的客户号,而他的客户是迷信的。重新打开它+1.重新开放。为什么要关闭它?其原理可能很奇怪,但这是一个完全有效的技术编程问题。如果你结束这篇文章,你必须在接下来的12个小时内结束每一个你认为理由不够好的问题。我认为这是一个相当愚蠢的问题。虽然我很想看到答案。虽然我不会投票支持这个问题,但我会投票让它重新开始。公平地说,可能只有一个人投票“不是真正的问题”,我们只是看到了这个原因。在投票结束之前,你应该先阅读这个问题。托尼似乎在想些什么。也许我们使用身份(1,26)来避免13的任何暗示。我不太熟悉触发器,但这不会创造一个种族条件吗?这正是我所想的,这可能是最好的答案。@saua:不,它不会创建竞争条件。在触发器完成之前,表是锁定的。为什么不能在插入之前完成此操作,以便您可以在提交之前修改id?如果他迷信,他也不会喜欢触发器中的13;)我以前的答案是错误的/误导性的,所以我做了一些测试,发现答案很简单,从1开始,然后递增13。这不是会留下很多空ID吗?当然,ID会变得相当大,相对较快。然而,这是一个非常简单的解决方案。@devinb:如果你有很多空ID,那又有什么关系呢?可能是因为1到14之间的宝贵空间被如此轻率地浪费了?什么,插入触发器?想不想详细说明一下那会是什么样子?所以。。。触发器中的13行吗?这很有趣…你能描述一下你是如何得出这些数字的吗?我在想一些简单的数学。呃。。。我从小于10000的素数开始,然后编写了一个小型python程序来验证哪些是正确的;)我更多的是编码而不是数学天才。。。
import sys

def x(start, step):
    count = 0
    i = start
    N = 1 << 31
    while i < N:
        #print i
        if i % 13 == 0:
            break
        i += step
        count += 1
    print i, i/13.0, count

if __name__ == '__main__':
    x(int(sys.argv[1]), int(sys.argv[2]))