2009-03-04 9 views
9

że mam poniższej tabeli:Jak zatrzymać wielokrotność 13 pojawiające się w kolumnie Identity

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

Ponieważ jestem przesądny, jak mogę przestać wielokrotności 13 pojawiające się w kolumnie ID?
tj .: Pomiń 13, 26, 39 itd.

Rozwiązanie w MySQL lub MSSQL bardzo doceniane.

+0

Nie możesz być poważny. –

+0

Aww człowiek. Może to być skrajny przykład meta-problemu, ale jest to interesujące pytanie. Może używa tożsamości jako numeru klienta do strony hazardowej, a jego klienci są przesądni. Ponownie otwórz! – JohnFx

+0

+1 ponowne otwarcie. Po co to zamykać? Przesłanka może być osobliwa, ale jest to całkowicie poprawne techniczne pytanie programistyczne. Jeśli to zamkniesz, musisz spędzić następne 12 godzin na zamknięciu każdego innego pytania, którego racjonalne myślenie nie jest wystarczająco dobre. – Simon

Odpowiedz

6

Tworzenie wyzwalacza, aby przejść do następnego każdym razem 13N - 1 pojawia się w sekwencji

BradC, to jest dla ciebie. Bez znajomości SQL Servera zrobię to w Oracle. This wydaje się być dobrym odniesienia dla wyzwalaczy w 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; 

Bez faktycznie testowania go, to prawdopodobnie nie będzie działać, ale z niewielką ilością prób i błędów można uzyskać jego pracy. Oracle ma obiekty sekwencji, które nie są w żaden sposób powiązane z tabelą, i możesz cały czas uderzać w sekwencję, bez dotykania stołu. Nie wiem, czy to prawda w SQL Server.

+0

Co, spust migawki? Chcesz podać szczegółowe informacje na temat tego, jak będzie wyglądać? – BradC

+0

Dzięki za odpowiedź :) – GateKiller

+0

Więc ... 13 w spustu jest w porządku? –

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

To nie działa .... Każda inna wielokrotność liczby 13 jest parzysta. –

+0

Więc może Tożsamość (1,13)? Pamiętaj, że definicja zawiera 13 ... –

+0

Kogut. To nauczy mnie, bym był zabawny! – ctrlalt3nd

4

Edytuj: poprzednia odpowiedź była całkowicie błędna.

Można to zrobić tak:

Identity(1, 13) 

Jak przetestowany przez:

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

Zwiększanie przez 13 lat, począwszy od dnia 1 nigdy nie powinien dać Ci wielokrotność 13, co najmniej do 10 milionów.

+0

Moja poprzednia odpowiedź była błędna/wprowadzająca w błąd, więc wykonałem kilka testów i uświadomiłem sobie, że odpowiedź jest tak prosta jak od 1 i zwiększana o 13. –

+0

Czy to nie pozostawia dużo pustych identyfikatorów? – DevinB

+0

Oczywiście, identyfikatory będą dość duże, stosunkowo szybko. To całkiem proste rozwiązanie. –

2

Utwórz wyzwalacz na wkładce.

Wstawiając coś, co jest wielokrotnością 13 minus 1 (12, 25, 38 itd.), Wstaw i natychmiast usuń inny wiersz.

Coś w tym stylu (może wymagać modyfikacji):

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

Nie jestem dobrze zorientowany w wyzwalaczach, ale czy nie byłoby to warunkiem wyścigu? –

+0

To jest dokładnie to, co myślałem i jest prawdopodobnie najlepszą odpowiedzią. –

+0

@saua: nie, nie stworzy warunku wyścigu, tabela jest zablokowana, dopóki wyzwalacz nie zostanie wykonany. –

3

Identity (7919, 4966)

ten powrócił 432'436 unikalne identyfikatory w int 32bit i żadna nie była wielokrotnością 13.

więcej par:

17, 1040 - Daje 2'064'889 wartości

17, 559 - Daje 3'841'653 wartości

[EDIT] Mały program, python do testu:

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

Używałem parę liczb pierwszych, ale to naprawdę nie działa; z liczbami głównymi mogłem uzyskać tylko sekwencje z liczbami 1-12. Zacząłem więc od losowej pary i zmieniłem drugą liczbę, aż skrypt przestanie powracać.

Nie mam pojęcia o matematycznych właściwościach dwóch liczb;) Ktoś?

+0

To jest bardzo interesujące. .. możesz opisać, jak wymyśliłeś te liczby? Myślę o czystej matematyce. – Beska

+0

Err ... Zacząłem od liczb pierwszych <10000, a następnie napisałem mały program pythona, aby sprawdzić, które z nich było w porządku;) Jestem bardziej programistą i mniej geniuszem matematycznym ... –

+0

Dobra, teraz musimy po prostu zmienić to w problem z kodem golfowym .... – JohnFx

Powiązane problemy