2009-03-04 6 views
9

Sagen, ich habe die folgende Tabelle:Wie mehrere von 13 erscheinen in einer Identitätsspalte stoppen

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

Da bin ich abergläubisch, wie kann ich ein Vielfaches von 13 zu stoppen in der ID-Spalte angezeigt?
dh: Skip 13, 26, 39 usw.

Lösung in MySQL oder MSSQL sehr geschätzt.

+0

Sie können nicht ernst sein. –

+0

Aww Mann. Dies mag ein extremes Beispiel für ein Meta-Problem sein, aber es ist eine interessante Frage. Vielleicht benutzt er die Identität als Kundennummer für eine Glücksspielseite und seine Kunden sind abergläubisch. Erneut öffnen! – JohnFx

+0

+1 wieder öffnen. Warum schließen Sie es? Die Begründung mag eigenartig sein, aber es ist eine vollkommen gültige Frage der technischen Programmierung. Wenn Sie das schließen, müssen Sie die nächsten 12 Stunden damit verbringen, jede andere Frage zu beenden, deren Begründung Sie für nicht gut genug halten. – Simon

Antwort

6

einen Trigger erstellen, um den nächsten 13n jedes Mal zu überspringen - 1 in der Reihenfolge

BradC kommt, ist dies für Sie. Ohne irgendwelche Kenntnisse von SQL Server, mache ich es in Oracle. This scheinen für Trigger in 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; 

ohne tatsächlich testen es eine gute Referenz, wird dies wahrscheinlich nicht funktionieren, aber mit einer kleinen Menge von Versuch und Irrtum, können Sie es zu arbeiten. Oracle verfügt über Sequenzobjekte, die nicht an die Tabelle gebunden sind, und Sie können die Sequenz den ganzen Tag überspringen, ohne die Tabelle zu berühren. Ich weiß nicht, ob dies in SQL Server zutrifft.

+0

Was, ein Insert-Trigger? Interessieren Sie sich für Details darüber, wie das aussehen würde? – BradC

+0

Danke für die Antwort :) – GateKiller

+0

Also ... eine 13 in einem Trigger ist in Ordnung? –

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

Das funktioniert nicht .... Jedes andere Vielfache von 13 ist gerade. –

+0

Also vielleicht Identität (1,13)? Wohlgemerkt, die Definition enthält eine 13 ... –

+0

Cock. Das bringt mir bei, dass ich versuche, lustig zu sein! – ctrlalt3nd

4

Edit: vorherige Antwort war völlig falsch.

Sie können es wie folgt tun:

Identity(1, 13) 

Wie getestet von:

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

Inkrementieren von 13, ausgehend von 1 sollten Sie nie ein Vielfaches von 13 geben, zumindest bis zu der 10 Millionen.

+0

Meine vorherige Antwort war falsch/irreführend, also habe ich ein paar Tests gemacht und festgestellt, dass die Antwort so einfach ist wie bei 1 beginnend und um 13 erhöht. –

+0

Bleibt das nicht eine Menge leerer IDs? – DevinB

+0

Natürlich, und die IDs werden relativ schnell relativ groß. Es ist jedoch eine ziemlich einfache Lösung. –

2

Erstellen Sie einen Trigger beim Einfügen.

Wenn Sie etwas einfügen, das ein Vielfaches von 13 minus 1 ist (12, 25, 38 usw.), fügen Sie eine weitere Zeile ein und löschen Sie sie sofort.

Etwas, dass (möglicherweise Änderungen müssen):

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

Ich bin nicht gut in Triggern vertraut, aber würde das nicht eine Race Condition erstellen? –

+0

Das ist genau das, was ich dachte, und ist wahrscheinlich die beste Antwort. –

+0

@Saua: Nein, es würde keine Wettlaufbedingung erzeugen, die Tabelle ist gesperrt, bis der Auslöser fertig ist. –

3

Identität (7919, 4966)

Diese 432'436 eindeutige IDs innerhalb eines 32-Bit-int zurückgegeben und keiner war ein Vielfaches von 13.

mehr Paare:

17, 1040 - Liefert 2'064'889 Werte

17, 559 - Renditen 3'841'653 Werte

[EDIT] Kleine Python-Programm zu testen:

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

habe ich nur ein paar Primzahlen aber das ist nicht wirklich funktioniert; Mit Primzahlen konnte ich nur Sequenzen mit 1-12 Zahlen erhalten. Also begann ich mit einem zufälligen Paar und variierte die zweite Zahl, bis das Skript nicht mehr zurückkehren würde.

Ich habe keine Ahnung von den mathematischen Eigenschaften der beiden Zahlen;) Jeder?

+0

Dies ist sehr interessant. Kannst du beschreiben, wie du mit diesen Zahlen gekommen bist? Ich denke an eine nette Mathematik. – Beska

+0

Err ... Ich begann mit den Primzahlen <10000 und schrieb dann ein kleines Python-Programm, um zu überprüfen, welche in Ordnung waren;) Ich bin mehr Programmierer und weniger Mathe-Genie ... –

+0

Okay, jetzt müssen wir nur dies zu machen ein Code-Golf-Problem .... – JohnFx

Verwandte Themen