insert into 2 tabellen; mogelijk?
Ik ben bezig en eigenlijk al veel te laat met normalisatie van tabellen.
Nu heb ik 1 tabel met bijna 600 spelers en een veld opmerking welke minder dan 40 keer gebruikt wordt.
Mijn probleem nu is wanneer ik een volledig toernooi wil kopiëren kon ik vroeger het veld opmerking meenemen in de veld lijst en alle spelers in 1 keer overnemen. Nu dus met een extra tabel lukt mij dit niet.
Kan ik met 1 query onmiddellijk de opmerking toevoegen indien ingevuld?
Als het niet kan moet ik de procedure herschrijven en speler per speler kopiëren.
mijn oude vereenvoudigde query
Code (php)
1
2
3
2
3
insert into trn_spelers (id_toernooi, naam, voornaam, opmerking)
select ' . $new_trn_id . ', naam, voornaam, opmerking
from trn_spelers where id_toernooi =' . $old_trn_id . ' order by id';
select ' . $new_trn_id . ', naam, voornaam, opmerking
from trn_spelers where id_toernooi =' . $old_trn_id . ' order by id';
Waarbij nu dus opmerking in de tabel trn_spelers_opmerkingen moet komen. Onderlinge link is het nieuwe (AUTO_INCREMENT) trn_spelers.id naar trn_spelers_opmerkingen.speler_id
Jan
Gewijzigd op 08/03/2023 09:35:35 door Jan R
Waarom kun je de lege waarde (lege string dan wel NULL) niet meenemen in deze query? Wat voor foutmelding volgt er dan?
2)
Een lijst met spelers (id, naam, opmerking)
Een lijst met toernooien
Een lijst die spelers aan toernooien koppel : speler_id, toernooi_id
lijkt me een handigere oplossing. De meeste speler houden namelijk heel lang dezelfde naam, dus het is wat zinloos om dat elke keer opnieuw op te slaan.
MySQL kan niet veel, het enige dat je daar hebt is de LAST_INSERT_ID(), en die geeft de laatst gegenereerde waarde van een AUTO_INCREMENT kolom. Die kan je hergebruiken in een functie, of nog liever in een transactie, of nog beter, in een CTE.
MariaDB kan sinds versie 10.5 wat PostgreSQL al tijden kan: INSERT INTO ... RETURNING. Hiermee kan je eenvoudig met een CTE (WITH-statment) één of meerdere rijen in één of meerdere tabellen in één keer invoegen.
Het stramien is ongeveer dit:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
WITH "invoegen" AS (
SELECT ...
), "ingevoegd" AS (
INSERT INTO "tabel1" (...)
SELECT ... FROM "invoegen"
RETURNING * ## of kolomnamen
)
INSERT INTO "tabel2" (...)
SELECT ... FROM "ingevoegd"
SELECT ...
), "ingevoegd" AS (
INSERT INTO "tabel1" (...)
SELECT ... FROM "invoegen"
RETURNING * ## of kolomnamen
)
INSERT INTO "tabel2" (...)
SELECT ... FROM "ingevoegd"
Dit idee werkt niet alleen voor INSERT, maar ook voor UPDATE en DELETE. Je kunt allerlei combinaties maken van data uit verschillende tabellen, door in een select te verwijzen naar meerdere tabellen of INSERT .. RETURNING resultaten.
Bij de weg: het is nooit te laat om een database te normaliseren.
Adoptive Solution op 08/03/2023 10:50:10:
Je kunt met een IF controleren of een opmerking bestaat en dan die opmerking opslaan in de tabel.
Deze oplossing zou ook kunnen :
https://stackoverflow.com/a/6855307
Deze oplossing zou ook kunnen :
https://stackoverflow.com/a/6855307
dan kan het nog steeds niet met meerdere records.
Ivo P op 08/03/2023 14:04:37:
1)
Waarom kun je de lege waarde (lege string dan wel NULL) niet meenemen in deze query? Wat voor foutmelding volgt er dan?
Waarom kun je de lege waarde (lege string dan wel NULL) niet meenemen in deze query? Wat voor foutmelding volgt er dan?
Omdat ik NU een andere tabel wil gebruiken voor die opmerking dus oorspronkelijk veld bestaat niet meer
Ivo P op 08/03/2023 14:04:37:
2)
Een lijst met spelers (id, naam, opmerking)
Een lijst met spelers (id, naam, opmerking)
Kan niet. de opmerking kan elke keer wijzigen
vb uitslag simultaan of kampioen vorig jaar
Ivo P op 08/03/2023 14:04:37:
Een lijst met spelers (id, naam, opmerking)
Een lijst met toernooien
Een lijst die spelers aan toernooien koppel : speler_id, toernooi_id
lijkt me een handigere oplossing. De meeste speler houden namelijk heel lang dezelfde naam, dus het is wat zinloos om dat elke keer opnieuw op te slaan.
Een lijst met toernooien
Een lijst die spelers aan toernooien koppel : speler_id, toernooi_id
lijkt me een handigere oplossing. De meeste speler houden namelijk heel lang dezelfde naam, dus het is wat zinloos om dat elke keer opnieuw op te slaan.
Dat is voor 1 van de volgende stappen :) Een ander toernooi concept is wel met een koppeltabel.
Ad Fundum op 08/03/2023 22:16:37:
Het hangt er sterk van af welke database je gebruikt.
maria 10.3.38-mysql
Ad Fundum op 08/03/2023 22:16:37:
MariaDB kan sinds versie 10.5 wat PostgreSQL al tijden kan: INSERT INTO ... RETURNING. Hiermee kan je eenvoudig met een CTE (WITH-statment) één of meerdere rijen in één of meerdere tabellen in één keer invoegen.
Dus nog te vroeg :)
Ad Fundum op 08/03/2023 22:16:37:
Bij de weg: het is nooit te laat om een database te normaliseren.
Bedankt. Maar er is nog een lange weg te gaan. Omdat het werkte heb ik het op de lange baan geschoven en da baan is héél lang.
Ik heb er dus maar speler per speler van gemaakt. Duurt iets langer ± 1 seconde.
Allemaal héél veel dank om mee te denken.
Jan