Toon posts:

[Mysql] twee tabellen met zelfde id *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Wij zijn bezig een systeem te bouwen met twee tabellen, de eerste voor de klantgegevens en de tweede wat de klant wil. Aangezien de klant meerdere keren kan terugkomen hebben we hier een speciale id voor nodig. Dit ziet er als volgt uit:

Tabel 1 = ID-naam
Tabel 2= ID-naam + ID-boeking

Nu moet de id naam uit de eerste tabel automatisch bij id-naam uit tabel twee worden weggeschreven op hetzelfde moment. De id wordt verkregen door een autoincrement in tabel 1. Dit kan dus niet in tabel twee met id-naam omdat dezelfde klant meerdere orders kan hebben. We willen het graag zonder een inlogsysteem als de klant voor het eerst komt, waardoor we dus niet eerst het id-naam uit tabel 1 kunnen opvragen om die in tabel 2 te plaatsen.

Verwijderd

misschien eens een tutorial lezen over standaard SQL! genoeg over te vinden!!! dit is zo basic!!

moet je eens voor de grap surfen naar google.com en dan zoeken op "SQL tutorial"

Als je het ergens niet mee eens bent hebben we gewoon topicreports hoor. Op deze manier met 20 uitroeptekens wekt alleen maar irritatie op... :/

[ Voor 35% gewijzigd door curry684 op 11-11-2003 12:58 ]


  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 10-11-2025

OkkE

CSS influencer :+

In PHP heb je daar de functie voor.

Maar er zal vast ook een MySQL functie voor zijn, die weet ik alleen niet uit mijn hoofd.

Door deze functie krijg je het ID van de laatst ge-Inserte record, deze kan je dan dus gebruiken bij het Inserten in de tweede tabel. :)

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Verwijderd

Topicstarter
In PHP hadden wij ook al een dergelijke functie gevonden, maar het probleem is dat wij het geheel met JSP aan het maken zijn, nu zijn we er achter gekomen dat dit waarschijnlijk met een foreign key moet, maar kan men dit in mysql ergens instellen?

  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

theodoor1981 kijk eens naar de mysql functie LAST_INSERT_ID ;)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


Verwijderd

MySQL heeft daarvoor de functie:

LAST_INSERT_ID()

Simplistisch voorbeeldje:

INSERT INTO table1 (name) VALUES ("pietje");

INSERT INTO table2 (id, data) SELECT LAST_INSERT_ID(), "data" FROM table1;

of (weet niet of dit ook werkt, geen MySQL bij de hand)

INSERT INTO table2 (id, data) VALUES (LAST_INSERT_ID(), "data");

Verwijderd

Topicstarter
Ben nu al een tijdje bezig geweest met het bovenstaande. Ik krijg echter telkens een foutmelding. Heb ook een iets andere manier geprobeerd daarbij werden echter alle id's uit de ene database in de andere geschreven, wat natuurlijk niet de bedoeling was :)
Onderstaant heb ik even de code gezet waar het geheel op toepassing is.

<sql:update>
INSERT INTO adres (VoorL, TusV, Aanhef, AchtN, Adres, HuisNr, PostC, WoonP, Tel, Email, Nat)
values(?,?,?,?,?,?,?,?,?,?,?)
<sql:param value="${param.VoorL}"/>
..........
<sql:param value="${param.Nat}"/>
</sql:update>

<sql:update>
INSERT INTO reserveringen (DatAD, DatAM, DatAJ, DatVD, DatVM, DatVJ, GewK, AanK, AanD, HPLO, BijzE, Bevest)
values(?,?,?,?,?,?,?,?,?,?,?,?)
<sql:param value="${param.DatAD}"/>
..................
<sql:param value="${param.Bevest}"/>

</sql:update>

<sql:update>
INSERT INTO reserveringen (IDNaam)
SELECT LAST_INSERT_ID(), "IDNaam" FROM adres
</sql:update>

Het is in JSTL en het probleem draait dus om het onderste stuk code, heb ik hier nu zo dan iets totaal verkeerd staan?
Het is dus de bedoeling dat de IDNaam uit de bovenste tabel in de IDNaam van de onderste komt te staan.

Verwijderd

Topicstarter
Iemand misschien nog ideeen, de code waar het om gaat staat hier boven gepost.

  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

• Wat voor foutmelding krijg je precies?
• Welke versie van mysql heb je geinstalleerd? (alleen > 4.1 ondersteund subqueries)

Probeer het volgende eens:
SQL:
1
2
3
4
<sql:update>
INSERT INTO reserveringen (IDNaam) 
SELECT LAST_INSERT_ID() FROM adres
</sql:update>


Zie ook:
MySQL.com | INSERT ... SELECT Syntax :)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
last_insert_id() is het laatste id dat is ingevuld voor de hele sessie van de gebruiker, niet per tabel, dus select last_insert_id() zou moeten werken.

Als je toch al met preparedstatements werkt waarom gebruik je de methode getGeneratedKeys() van dat het statement dan niet?

Verwijderd

Topicstarter
Als ik het stukje code van DeverauX gebruik wordt er in de tabel die nodig is niets ingevuld, en worden er een x aantal nieuwe tabellen bijgeschreven die gelijk zijn aan het aantal records die in de tabel adres staan met allemaal een 0,
Als ik IDNaam achter Last_Insert plaats.
<sql:update>
INSERT INTO reserveringen (IDNaam)
SELECT LAST_INSERT_ID(IDNaam) FROM adres
</sql:update>
Geeft hij wel de id's weer uit de tabel adres, maar niet in de bedoelde record maar hij maakt een nieuwe en natuurlijk ook weer voor alle records die in de tabel staan, terwijl er toch wordt gezegd dat hij alleen de laatste moet pakken.
Nog ideeën?

Ik begrijp na een beetje googlen dat getGeneratedKeys() een vernieuwde functie is van select_last_insert_id, maar hoe moet ik die dan gebruiken.

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Het is een methode van PreparedStatement terwel last_insert_id() een functie is van MySQL.

Je voert je insert statement uit, er wordt een auto-increment id automatisch ingevuld. Dan nadat het statement is uitgevoerd kan je met pstmt.getGeneneratedKeys() een resultset opvragen met all die keys.
Java:
1
2
3
4
5
ResultSet rs = pstmt.getGeneratedKeys();
long key1 = 0;
if (rs.next()) {
  key1 = rs.getLong(1);
}


Natuurlijk werkt dit zo niet met de tags die jij gebruikt maar het zal vast wel mogelijk zijn, op een of andere manier.

[ Voor 5% gewijzigd door Gert op 14-11-2003 08:00 ]

Pagina: 1