Avatar billede kresten Nybegynder
26. oktober 1999 - 14:26 Der er 15 kommentarer og
1 løsning

Hvordan findes ID'et i tabellen


Jeg har en almindelig INSERT statement, hvor jeg skal bruge dens primær nøgle værdi som har en autonumber type (jeg har upsizet fra Access).

F.eks. ser tabellen sådan ud:
id int
navn varchar(100)
tlf varchar(12)

... hvis jeg så siger:

INSERT INTO(navn, tlf) VALUES('her', '12345678')

Hvordan får jeg fat i ID feltet???
Hvis man siger SELECT @@IDENTITY as mitID from minTabel så er resultatet rimelig mystisk. Det holder heller ikke at SELECTe den record der her 'her' og '12345678' i, da nogle records er næsten ens.
Avatar billede blackthorne Nybegynder
26. oktober 1999 - 14:29 #1
det skulle virke hvis du har sat id til et identity field. har du det
Avatar billede blackthorne Nybegynder
26. oktober 1999 - 14:34 #2
Syntaksen er således

CREATE TABLE jobs

(
  Id  int IDENTITY(1,1),
  Navn varchar(100,
  tlf varchar(12)
)

ellers højreklik på tabel og vælg identity under kolonnen id + en værdi hvorfra feltet skal starte fra og hvormeget værdien skal steppe med
 
Avatar billede blackthorne Nybegynder
26. oktober 1999 - 14:36 #3
Hele humlen omkring identity er at du ikke skal bekymre dig omkring feltet ved insert, derfor må du heller ikke angive et identity felt i din værdi liste
Avatar billede kresten Nybegynder
26. oktober 1999 - 14:42 #4
Erhmm... nej. Det var nu ikke lige det jeg mente.

Okay, jeg prøver igen.

Efter min INSERT skal jeg bruge primær nøglen i en anden tabel hvor den fungerer som fremmednøgle.

Så det er noget i stil med:

insert i tabel1
find primær nøgle
insert primær nøgle i tabel2

Er det forklaret godt nok?
Avatar billede blackthorne Nybegynder
26. oktober 1999 - 14:44 #5
DECLARE @ID Integer
INSERT (Navn, Tlf) VALUES ('her', '12345678')
SELECT
Avatar billede blackthorne Nybegynder
26. oktober 1999 - 14:47 #6
damn tab og return

DECLARE @ID Integer
INSERT Test(Navn, Tlf) VALUES ('her', '12345678')
SELECT @ID = @@IDENTITY
INSERT Test2(ID, Navn, Tfl) VALUES (@Id,'Test', 'Test')

Dette kan kun virke hvis der ikke er nogen insert trigger
ellers kan @@IDENTITY være sat til noget forkert.

SELECT @ID = @@IDENTITY skal altid køres lige efter indsættelsen.

Jeg har 2 andre forslag, hvis du ikke kan benytte dette
Avatar billede lrj Nybegynder
26. oktober 1999 - 14:57 #7
Hmm, er det så ikke nødvendigt at ovenstående udføres som 1 transaktion? Ellers kan der jo komme en anden imellem.

Virker metoden også med uniqueidentifiers som primary key?
Avatar billede kresten Nybegynder
26. oktober 1999 - 15:02 #8
Hej Blackthorne

Umiddelbart ser det ud som det er noget jeg kan bruge.

Problemet er bare at jeg bruger det i ASP, og får en "Must declare variable '@ID'"

Noget tyder på at hvis det ikke fyres af i et script, så mister den variablen (ude af scope eller hvad?)

Ngen forslag?
Avatar billede blackthorne Nybegynder
26. oktober 1999 - 15:03 #9
Det gør vist ingen forskel om det gøres i en transaction, fordi @@Identity er en global variable som benyttes for alle identity field. jeg mener ikke at access til globale variable inkluderes i transaktion. Derfor er denne løsning ikke multiuser sikret, ej hellere i en transaktion. et af mine andre forslag er sikret imod multiuser problematikken
Avatar billede blackthorne Nybegynder
26. oktober 1999 - 15:04 #10
har du husket DECLARE @ID Integer.

Desuden der må ikke være nogle go statements imellem erklæringen af variable og når den anvendes
Avatar billede kresten Nybegynder
26. oktober 1999 - 15:12 #11

Ok, her er testen.....

set dbConnection = Server.CreateObject("ADODB.Connection")
dbConnection.Open Application("connectionString")
SQLStatement1 = "DECLARE @studentID Integer"
SQLStatement2 = "INSERT INTO student (navn, tlf) VALUES ('test', 'test')"
dbConnection.Execute(SQLStatement1)
set r = dbConnection.Execute(SQLStatement2)

SQLStatement3 = "SELECT @studentID = @@IDENTITY FROM student"
set r = dbConnection.Execute(SQLStatement3)

SQLStatement4 = "INSERT INTO student (ID, navn, tlf) VALUES (@studentID, 'test', 'test')"


Jeg kunne forstille mig at det er noget med recordsettet (set r = xxxxx)


Avatar billede blackthorne Nybegynder
26. oktober 1999 - 15:22 #12
Det skal være følgende

set dbConnection = Server.CreateObject("ADODB.Connection")
dbConnection.Open Application("connectionString")
SQLStatement1 = "DECLARE @studentID Integer"
SQLStatement1 + "INSERT INTO student (navn, tlf) VALUES ('test', 'test')"
SQLStatement1 + "SELECT @studentID = @@IDENTITY FROM student"
SQLStatement1 + "INSERT INTO student (ID, navn, tlf) VALUES (@studentID, 'test', 'test')"
dbConnection.Execute(SQLStatement1)
set r = dbConnection.Execute(SQLStatement1)

Det hele skal køres på engang eller kender serveren ikke længere variablen, fordi variabler lever kun indtil næste go statement eller indtil connection forsvinder og det gør den i dit tilfælde.


Avatar billede kresten Nybegynder
26. oktober 1999 - 15:33 #13
Yep

Det virker som det skal! Mange tak
Avatar billede blackthorne Nybegynder
26. oktober 1999 - 15:41 #14
Ja det virker, men husk på at i ekstreme tilfælde kan du risikere at få en andens brugers unikke nr. Det skal du lige huske er at undersøge om du vil tillade dette. Hvis du ikke vil tillade dette er der andre metoder!!!, som er lidt mere besværlige end nævnte
Avatar billede kresten Nybegynder
26. oktober 1999 - 15:50 #15

Kan de betale sig sig at låse basen mens man udfører SQL'en?
Avatar billede blackthorne Nybegynder
26. oktober 1999 - 15:58 #16
Nej for det sker måske i 0.005 af tilfældende. Desuden hvis du låser databasen ødelægger du at der kan være flere på systemet afgang og vil få lange svartider.
løst beskrivet lavet det således
man har en tabel med en kolonne som indeholder det sidste uniknr, så laver man en stored procedure der ligger i en transaktion, som først opdatere kolonnen med værdien af kolonnen + 1 og derefter select kolonnen som returnerer værdien

Grunden til at det er multibruger sikret er fordi når man først opdater og læser en værdi fra en tabel i en transaktion, så kan andre connection ikke opdatere felt men må vente til det bliver deres turn
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester