Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

Direct vullen van zowel tabel als tussentabel [sql]

Anoniem
None
4 antwoorden
  • Stel je hebt de volgende tabellen

    <klant> met sleutel over klantnr (auto_increment)
    <member> met sleutel over membernr (auto_increment)
    <klanten_members> met sleutel over zowel klantnr als membernr

    Stel je maakt een nieuwe member aan, die je wilt koppelen aan
    een klant

    Deze nieuwe member wordt opgeslagen in de tabel member.
    Het membernr wordt vervolgens automatisch gegenereerd (auto_increment).

    Omdat deze meteen gekoppeld moet worden aan een bepaalde klant moet
    natuurlijk het membernr samen met het klantnr in de tabel klanten_members komen.

    Nu is mijn vraag hoe kan je dit het beste doen? Als je een nieuwe member toevoegt weet je namelijk het membernr nog niet. Dus dit membernr moet je achteraf eerst weer opvragen om het vervolgens weer in de tabel <klanten_members> te zetten.

    Dit zijn weliswaar sequentiele handelingen, maar kan het niet zo zijn dat in
    de tussentijd een member wordt aangemaakt waardoor bij het opvragen van dat nummer de verkeerde member wordt doorgegeven?

    Is hier een beter manier voor?

    Ik hoop dat de vraag duidelijk is,

    alvast bedankt.
  • De beste keus lijkt mij om alle acties binnen een transaction te laten plaatsvinden waarbij een lock wordt geplaatst op de table(s) in kwestie (bij voorkeur binnen een stored procedure). Als binnen dezelfde transactie een member toegevoegd wordt en het het nieuwe member ID wordt opgevraagd kan deze niet weggegeven worden bij een andere member toevoeging.

    Het belangrijkste gegeven laat je echter weg, namelijk met welke database je werkt. Niet alle mogelijkheden die er zijn worden namelijk door alle databases ondersteund.
  • ik gebruik Interbase als database.

    volgens mij ondersteunt deze stored procedures al heb ik daar nog geen ervaring mee.

    bedankt voor de reactie en ik ga het proberen.
  • [quote:068b4ec705="Deathlon"]
    Nu is mijn vraag hoe kan je dit het beste doen? Als je een nieuwe member toevoegt weet je namelijk het membernr nog niet.[/quote:068b4ec705]
    Dit weet je wel.
    [quote:068b4ec705="Deathlon"]Dus dit membernr moet je achteraf eerst weer opvragen om het vervolgens weer in de tabel <klanten_members> te zetten.

    Dit zijn weliswaar sequentiele handelingen, maar kan het niet zo zijn dat in
    de tussentijd een member wordt aangemaakt waardoor bij het opvragen van dat nummer de verkeerde member wordt doorgegeven?
    [/quote:068b4ec705]
    Klopt en daarom is dit ook niet de goede manier.
    [quote:068b4ec705="Deathlon"]ik gebruik Interbase als database.[/quote:068b4ec705]
    #1
    Je genereert eerst het nummer en gebruikt die op het moment dat je je record in de tabel insert.
    [code:1:068b4ec705]
    SELECT GEN_ID(myGeneratorMemberNr,1) AS NewMemberId FROM rdb$database

    en vervolgens

    INSERT INTO member (membernr, …) VALUES (*NewMemberId*, …)
    INSERT INTO klanten_member (klantnr,membernr) VALUES (*klantnr*,*NewMemberId*)
    [/code:1:068b4ec705]
    Ik neem aan dat je een INSERT en een UPDATE trigger hebt waar je pas een nieuwe uniek nummer genereert als de [i:068b4ec705]sleutel[/i:068b4ec705] NULL of 0 is. 8)
    Immers, een sleutel is eigenlijk een UNIQUE CONSTRAINT.

    #2 Nog een keer het ontwerp van je database onder de loep nemen.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.