2016-05-16 17 views
1

Ich habe eine Tabelle, die keine automatischen Inkremente hat. Ich muss Daten in diese Tabelle einfügen, jedes Mal durch die ID Erhöhen 1000.Variable in SQL erhöhen

So habe ich

SELECT @maxId = Max(ID) 
INSERT INTO TABLE1 
    (ID, DATA) 
VALUES 
    (@maxId + 1000, DATA), 
    (@maxId + 2000, DATA), 
    (@maxId + 3000, DATA) 

Statt explizit die ID für jeden Einsatz erhöht wird, gibt es eine Möglichkeit, es haben ‚auto -Zuwachs'. Ich kann nicht eine der so LAST_INSERT_ID() oder etwas verwenden, einfach weil die IDs in einer seltsamen Art und Weise erstellt werden

+0

eine Schleife erstellen, ein Einsatz pro Iteration erhöhen @maxid bei jeder Iteration. –

+0

Haben Sie erwogen, möglicherweise etwas zu verwenden, das einer Tally-Tabelle ähnlich ist, z. B. eine vorbelegte Tabelle mit Ganzzahlen, die auf Ihre Bedürfnisse angepasst werden könnte, mit Ihren INSERTS über einen Join gegen die Tally-Tabelle .... so wie Sie würde mindestens einen Schuss haben, um die Kosten der iterativen/Loop-basierten Einsätze zu vermeiden –

+0

Leider ist dies eine Tabelle bei der Arbeit, so kann ich nichts ändern –

Antwort

1

Es gibt nichts, was Sie davon abhält, die folgenden Schritte auszuführen und die Daten korrekt einzufügen.

insert into table1(ID,DATA) 
VALUES ((select max(id) from table1 as T) +1000, DATA), 
     ((select max(id) from table1 as T) +1000, DATA); 

Oder ist es etwas anderes, das du meintest?

+3

Ich glaube, die Unterabfragen werden vor den Einfügungen ausgewertet, so dass die beiden Unterabfragen den gleichen Wert erzeugen. –

+0

Ich denke nicht, und ich habe ohne Probleme getestet, auf MySQL – Spade

+1

Dies scheint nicht auf Microsoft SQL Server Mgmt zu funktionieren –

5

Sie können das Feld auf diese Weise erklären:

MyID INT IDENTITY (0,1000); 

Dies wird Autoinkrement jeden Datensatz von 1000 .

Zum Beispiel

:

CREATE TABLE MyTable 
(
    MyID INT IDENTITY(0,1000), 
    SField VARCHAR(128) 
); 

INSERT INTO MyTable (SField) VALUES ('TEST'); 
INSERT INTO MyTable (SField) VALUES ('TEST1'); 
INSERT INTO MyTable (SField) VALUES ('TEST2'); 


SELECT * FROM MyTable 

folgendes Ergebnis liefern wird:

| MyID | SField | 
----------------- 
| 0 | TEST | 
| 1000 | TEST1 | 
| 2000 | TEST2 | 
+0

Scheint mir das OP angezeigt Auto-Inkremente waren keine Option –

+0

Ich lese es anders herum, er fügt die ID manuell, aber er will es automatisch inkrementiert – ArturoAP

+2

Die Identität (von dem was ich lese) muss sein Wird beim Erstellen der Tabelle angegeben. Ist das korrekt? –

2

Sie können dies auch ROW_NUMBER() mit tun:

with v(data) as (
     select v.*, row_number() over (order by (select null)) as seqnum 
     from (values(data), (data), (data)) v 
    ) 
insert into table1 (id, data) 
    select @maxid + seqnum * 1000, data 
    from v; 
1

Sie können eine Race-Bedingung erhalten max(id) wenn 2 Benutzer verwenden versuchen, die gleichzeitig einzusetzen - sie konnten beide mit dem gleichen id Wert am Ende. Sie könnten versuchen, GUIDs anstelle von Integer-IDs (uniqueidentifier) zu verwenden. Verwenden Sie die Funktion NEWID(), die immer eine neue eindeutige GUID-Nummer zurückgibt. Es ist ein bisschen mühsam, von Integer-Schlüsseln in GUID-Schlüssel zu konvertieren, aber es lohnt sich. Es gibt jedoch einen leichten Leistungseinbruch, und sie sind viel schwerer zu lesen! Ein schöner Vorteil ist, dass Sie frische Daten aus der Produktion in Ihre Testdatenbank importieren können, ohne sich um doppelte Schlüssel kümmern zu müssen.

+0

Solange die GUID nicht Ihr Clustered-Index ist, funktionieren sie gut .... aber wie erwähnt sind sie Schmerzen zu arbeiten. –

0

man konnte immer erstellen Sie einfach eine neue sequence auf der ein Tropfen fliegen sie jedes Mal, nachdem Sie es verwenden ..

CREATE SEQUENCE CountBy1000 
    START WITH 1000 
    INCREMENT BY 1000 ; 

INSERT INTO Table1 
VALUES ((select max(id) from table1 as T) + NEXT VALUE FOR CountBy1000, DATA), 
     ((select max(id) from table1 as T) + NEXT VALUE FOR CountBy1000, DATA); 

DROP SEQUENCE CountBy1000;