Sie sind nicht angemeldet.

  • Anmelden

1

04.03.2009, 20:38

SQL-Frage

folgendes:

Ich habe eine ID-Spalte die nicht null sein darf und als Primärschlüssel definiert ist.
Jetzt will ich ein Tubpel einfügen dessen ID einen beliebigen int-Wert bekommen soll, der aber logischerweise noch nicht vorkommen darf.

Wie kann ich daß im rahmen eines INSERT befehls machen?
Gibt es da was sql-server spezifisches?
Ich will/kann die Spalte eigentlich nicht als IDENTIFY setzen.

2

04.03.2009, 20:45

Je nachdem welcher SQL Dialekt das ist, macht das deine Datenbank automatisch. Die wird einfach die nächste logisch folgende Zahl nehmen. Beim Insert brauchst du dich um diese Spalte nicht mehr explezit zu kümmern.

3

04.03.2009, 21:10

Bei MySQL auto increment und bei Oracle Sequences

4

04.03.2009, 23:56

MaxPower hats schon gesagt ;)

Keine Ahnung hört sich nach einer Uni Aufgabe an bei der du evtl mit sowas nicht kommen kannst:

Denke Formell kannst auch über z.n MAX(ID) +1 auf den vorigen Wert Bezug nehmen unter der Prämisse, dass die SQL Befehle nacheinander abgearbeitet werden und dann einfach die größte ID um eins erhöhen ;)
Allerdings hat das mit Performance nichts zu tun!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Frosti« (04.03.2009, 23:57)


5

05.03.2009, 07:21

Mit "sql-server spezifisches" meinte ich eigentlich microsoft sql server 2008. Also T-SQL

6

05.03.2009, 08:58

mir ist dort nur identity bekannt... that's the ms way.

create table mytable
(
[ID] IDENTITY(1,1) Primary Key
)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Frosti« (05.03.2009, 08:59)


-=)GWC(RaMsEs

unregistriert

7

05.03.2009, 10:14

hm T SQL eknn ich jetzt nicht aber bei SQL geht as mit einer sequence.

8

05.03.2009, 12:02

Schreib eine Stored Procedure, die edir eine rdm ID zurückliefert die es noch nicht gibt. Man muss halt alle IDs auslesen. Oder noch besser einen Trigger before Insert.

T SQL kenn ich nicht, sollte aber gehen.

-=)GWC(RaMsEs

unregistriert

9

05.03.2009, 13:36

Zitat

Original von MfG_iLGenio
Schreib eine Stored Procedure, die edir eine rdm ID zurückliefert die es noch nicht gibt. Man muss halt alle IDs auslesen. Oder noch besser einen Trigger before Insert.

T SQL kenn ich nicht, sollte aber gehen.


o_O

Ist vielleicht Microsoft aber das muss besser gehen :-D und wenn man sich nur einen Trigger before insert schreibt der einem den wert aus einer tabelle holt und dann den mit n+1 updated. damit hat man sich im endeffekt eine einfache sequence selber geschrieben.

10

05.03.2009, 15:22

Zitat

Original von MfG_iLGenio
Schreib eine Stored Procedure, die edir eine rdm ID zurückliefert die es noch nicht gibt. Man muss halt alle IDs auslesen. Oder noch besser einen Trigger before Insert.

T SQL kenn ich nicht, sollte aber gehen.


Stored Procedure? Trigger? Nur fuer ne ID? Nicht gerade die eleganteste Loesung, bin mir sicher dass MS da etwas anbietet was etwas "natuerlicher" ist...

Ausserdem sollte es concurrency-safe sein, also sowas wie atomare inserts (also stored procedure call und insert ist eine atomare option)

11

05.03.2009, 16:01

oops sry. Sollte genauer lesen :/ Dachte er will eine zufallsgenerierte ID. :D

12

05.03.2009, 16:18

@ max

Zitat

Original von Frosti
create table mytable
(
[ID] IDENTITY(1,1) Primary Key
)


das ist das gegenstück zu auto increment. um 1 hochzählen, start bei 1

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Frosti« (05.03.2009, 16:18)


13

05.03.2009, 17:41

Zitat

Original von Frosti
@ max

Zitat

Original von Frosti
create table mytable
(
[ID] IDENTITY(1,1) Primary Key
)


das ist das gegenstück zu auto increment. um 1 hochzählen, start bei 1


kann sein:) Ich hab das aber auch nicht in frage gestellt:)

14

05.03.2009, 18:02

mhhh
Könnte vielleicht so eine @@ variable geben in der eine zufällige unvergebene primärschlüssel-id steht

Aber werd ich wohl doch die spalte mit IDENTITY versehen müssen.