Как остановить отображение кратного числа из 13 в столбце идентификаторов - PullRequest
9 голосов
/ 04 марта 2009

Скажите, у меня есть следующая таблица:

Create Table Comments (
    ID Int Identity(1,1) Not Null Primary Key Clustered,
    Comment Text Not Null
)

Поскольку я суеверен, как я могу остановить появление кратных 13 в столбце идентификаторов?
т.е. пропустить 13, 26, 39 и т. Д.

Решение в MySQL или MSSQL высоко ценится.

Ответы [ 5 ]

6 голосов
/ 04 марта 2009

Создать триггер для перехода к следующему каждый раз, когда в последовательности появляется 13n - 1

BradC, это для тебя. Без каких-либо знаний о 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 есть объекты последовательности, которые вообще не привязаны к таблице, и вы можете изменять последовательность весь день, если хотите, даже не касаясь таблицы. Я не знаю, правда ли это в SQL Server.

4 голосов
/ 04 марта 2009

Редактировать: предыдущий ответ был полностью неправильным.

Вы можете сделать это так:

Identity(1, 13)

Как проверено:

for (int i = 1; i < 10000000; i += 13)
{
    if (i % 13 == 0)
    {
        Console.WriteLine(i);
    }
}

Увеличение на 13, начиная с 1, никогда не должно давать кратное 13, по крайней мере, до 10 миллионов.

3 голосов
/ 04 марта 2009

личность (7919, 4966)

Это вернуло 432'436 уникальных идентификаторов в 32-битном int, и ни один не был кратен 13.

Больше пар:

17, 1040 - выходы 2'064'889 значений

17, 559 - Выходы 3'841'653 значения

[EDIT] Небольшая программа для тестирования на питоне:

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]))

Я просто использовал пару простых чисел, но это не сработало; с простыми числами я мог получить только последовательности с 1-12 числами. Поэтому я начал со случайной пары и менял второе число, пока сценарий не перестал возвращаться.

Я понятия не имею о математических свойствах двух чисел;) Кто-нибудь?

2 голосов
/ 04 марта 2009

Создать триггер при вставке.

При вставке чего-либо, кратного 13 минус 1 (12, 25, 38 и т. Д.), Сразу вставьте и удалите другую строку.

Что-то в этом роде (может потребоваться модификация):

CREATE TRIGGER ON [table_name]
AFTER INSERT
AS
    -- Get the last inserted identifier
    DECLARE @LastID INT -- or whatever type is your identity column
    SET @LastID = SELECT ID FROM inserted -- inserted holds the inserted entry

    -- Check if the ID is a multiple of thirteen minus 1
    IF ((@LastID + 1) % 13 = 0) -- not sure it would work, but something like that
    BEGIN
        INSERT INTO [table_name]
        -- dummy values

        DELETE FROM [table_name] WHERE ID = (@LastID + 1)
    END

GO
0 голосов
/ 04 марта 2009
Create Table Comments (    
    ID Int Identity(2,2) Not Null Primary Key Clustered,    
    Comment Text Not Null
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...