Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[SQL] Hoe het volgende id opvragen ?

Pagina: 1
Acties:

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 22-09 14:46

Wijnbo

Electronica werkt op rook.

Topicstarter
Stel de volgende database :

Tabel A
PageID <autonummering> <pk>
VersieID, verplicht

Tabel B
VersieID <pk>
PageID <pk><fk>

Nu wil ik een nieuw record toevoegen aan tabel a, maar daarvoor heb ik een record uit b nodig. Echter, om b aan te maken, moet ik weten wat het volgende PageID gaat worden van tabel A, aangezien dit onderdeel van de PK is van tabel B.

Hoe kan ik in SQL het volgende toe te wijzen ID opvragen van een bepaalde kolom?

Heb zelf al gezocht en ben dingen tegengekomen als SCOPE_IDENTITY, @@IDENTITY, etc, maar die komen allemaal na een INSERT. Die kan ik dus nog niet doen... Hoe dit op te lossen ?

Zit nu zelf al te denken om de versie maar niet verplicht te maken, dus eerst a aan te maken, dan b op basis hiervan te maken en verrvolgens a te updaten, maar dat vind ik een beetje krom... dit moet toch gewoon kunnen?

[ Voor 14% gewijzigd door Wijnbo op 30-06-2008 09:04 ]


  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Dit hangt erg af van je database....is het Oracle, mysql, mssql of nog iets anders?

Los daarvan wil je misschien nadenken of het opvragen van het id voordat je het insert een handige keuze is....wat gebeurt er als je gelijktijdig twee records wilt toevoegen?

When life gives you lemons, start a battery factory


  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 22-09 14:46

Wijnbo

Electronica werkt op rook.

Topicstarter
KabouterSuper schreef op maandag 30 juni 2008 @ 09:08:
Dit hangt erg af van je database....is het Oracle, mysql, mssql of nog iets anders?

Los daarvan wil je misschien nadenken of het opvragen van het id voordat je het insert een handige keuze is....wat gebeurt er als je gelijktijdig twee records wilt toevoegen?
Vergeten te melden, MSSQL 2005.

Verder zou ik het bovenstaande toch in een transactie kunnen zetten ?

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Sure dat een transactie genoeg is?

Tegenvoorbeeld: Twee gelijktijdige sessies vragen eerst wat het volgende id is....deze geven hetzelfde id terug. Vervolgens probeer je het id te inserten, en je zit met een conflict!

When life gives you lemons, start a battery factory


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wijnbo schreef op maandag 30 juni 2008 @ 09:08:
Verder zou ik het bovenstaande toch in een transactie kunnen zetten ?
Maar in dat geval kan je het toch ook gewoon achteraf op vragen, als de eventuele andere afhankelijkheden niet kloppen kan je altijd nog terugrollen.

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 22-09 14:46

Wijnbo

Electronica werkt op rook.

Topicstarter
ACM schreef op maandag 30 juni 2008 @ 09:12:
[...]

Maar in dat geval kan je het toch ook gewoon achteraf op vragen, als de eventuele andere afhankelijkheden niet kloppen kan je altijd nog terugrollen.
Ik ben zelf al wat aan het bouwen geweest, en heb nu zoiets:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
ALTER PROCEDURE [dbo].[spCreatePage]
    @pagename           VARCHAR(255),
    @userid             INT
AS
BEGIN
    BEGIN TRAN
        INSERT INTO nc_page VALUES(@userid, GETDATE(),1,1,@pagename )
        PRINT SCOPE_IDENTITY()
    COMMIT TRAN
END

EXECUTE spCreatePage 'Test', 1


Ik krijg het toe te wijzen id er alleen niet uit, want bij die insert gaat iet meteen al fout natuurlijk...

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Na drie minuten lezen in de MSDN (Sql books online) dan had je gezien dat ident_current('table_name') het laatst uitgegeven ID terug geeft, dat ident_incr('table_name') het volgende id terug geeft (handig als default statement van een tabel als je niet een standaard autonummering wilt).

VersieID kun je wel verplicht stellen, alleen moet je daaraan een default van '0' toekennen zodat het mogelijk is een 'eerste' versie te krijgen, anders krijg je een circulair dependency en in jouw geval zelfs een deadlock (tabel A is afhankelijk van B, en B is afhankelijk van A). Haal in tabel B de PK van PageID en maak van B.VersieID een autonummer veld. Vervolgens kun je een trigger op B zetten welke A.VersieID update als in B een record wordt toegevoegd..

If it isn't broken, fix it until it is..


  • BlaTieBla
  • Registratie: November 2000
  • Laatst online: 08:14

BlaTieBla

Vloeken En Raak Schieten

Mij is niet helemaal duidelijk wat je nu exact wilt bereiken. Waar wordt de database voor gebruikt. Misschien is je opzet al niet helemaal goed en kan het beter/sneller/eenvoudiger.

leica - zeiss - fuji - apple | PSN = Sh4m1n0


  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 22-09 14:46

Wijnbo

Electronica werkt op rook.

Topicstarter
Niemand_Anders schreef op maandag 30 juni 2008 @ 09:15:
Na drie minuten lezen in de MSDN (Sql books online) dan had je gezien dat ident_current('table_name') het laatst uitgegeven ID terug geeft, dat ident_incr('table_name') het volgende id terug geeft (handig als default statement van een tabel als je niet een standaard autonummering wilt).

VersieID kun je wel verplicht stellen, alleen moet je daaraan een default van '0' toekennen zodat het mogelijk is een 'eerste' versie te krijgen, anders krijg je een circulair dependency en in jouw geval zelfs een deadlock (tabel A is afhankelijk van B, en B is afhankelijk van A). Haal in tabel B de PK van PageID en maak van B.VersieID een autonummer veld. Vervolgens kun je een trigger op B zetten welke A.VersieID update als in B een record wordt toegevoegd..
Welke leet hax woorden heb jij op gezocht dan? :P Tevens zat ik zelf ook al na te denken over die circulair dependency, had al het gevoel dat het niet helemaal lekker is... Die trigger oplossing is inderdaad netter. Het is echter zo dat de gebruiker straks de versie te zien krijgt, dus het is mooier als elk pageid straks een versie 1 heeft, een versie 2, etc. Een extra kolom opnemen ID met een autonummering vind ik ook niet echt een oplossing om over naar huis te schrijven.. dat je dus ID<pk, autonr> PageID<fk> Versie <int> krijgt ofzo...

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Welke leet hax woorden heb jij op gezocht dan?
Ik heb gezocht op 'mssql ident', aangezien de meeste auto increment functie van de verschillende database daarmee beginnen. Ook kun je de T-sql reference (sql books online) gebruiken om te zien welke functies beschikbaar zijn. De ident_* functies waren je dan vast wel opgevallen.

Wat betreft de dependecies: VersionID wordt autonumering. Je krijgt dus geen extra ID veld. A.VersionID wordt dan via de trigger automatisch geupdate voor PageID. Joinen op versionid is dan een koud kunstje. Tabel A bevat dus alleen maar 'meta' data, terwijl B de daadwerkelijk data (inhoud) bevat. Je kunt ook via een before trigger het volgende VersionID bepalen middels 'Max(VersionID) + 1' . Eventueel zou je dan alsnog geen combined primary key kunnen behouden.

If it isn't broken, fix it until it is..

Pagina: 1