insert into 2 tabellen; mogelijk?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan R

Jan R

08/03/2023 09:32:23
Quote Anchor link
Hoi

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)
PHP script in nieuw venster Selecteer het PHP script
1
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';


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
 
PHP hulp

PHP hulp

30/11/2024 11:59:38
 
Adoptive Solution

Adoptive Solution

08/03/2023 10:50:10
Quote Anchor link
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
 
Ivo P

Ivo P

08/03/2023 14:04:37
Quote Anchor link
1)
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.
 

08/03/2023 22:16:37
Quote Anchor link
Het hangt er sterk van af welke database je gebruikt.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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"


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.
 
Jan R

Jan R

09/03/2023 11:20:26
Quote Anchor link
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

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?

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)

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.

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.