[MariaDB] - ALTER TABLE ADD COLUMN variabele naam

Pagina: 1
Acties:

Vraag


  • sus
  • Registratie: September 2000
  • Laatst online: 23:46

sus

is druk :+

Topicstarter
Ik heb een MariaDB draaien, waarin ik een tabel heb:

Namen:
IDNAMEN
1Jan
2Klaas
3Piet
4Hans
5Karel
Wat ik zou willen is dat ik een andere tabel nu extra kolommen kan geven, met de namen vanuit deze tabel

Dus:
ALTER TABLE `anderetabel`
ADD <waardes van kolom NAMEN>
VARCHAR(10) NULL DEFAULT NULL;

Ik doe het nu met 4 regels PHP, waar ik dus eerst de namen ophaal, in een variabele kiep en die dan een-voor-een toevoeg met een ALTER-commando, maar vraag me af of dit direct in de DB gedaan kan worden.

Als het niet kan, dan hou ik dus mijn stukje PHP actief :)

Even ter aanvulling n.a.v. de reactie van @Juup:
Klopt, het is totaal tegen de regels in. Maar, de tabel waar ik deze kolommen aan toe wil voegen is steeds eenmalig nodig, na gebruik wordt hij weer weggegooid (DROP). De rest van alle gegevens is uiteraard netjes volgens de regels opgezet. Door gebruik te maken van deze tabel kan ik echter heel veel sneller alle verschillende data naast elkaar zetten en dan in 1x als .csv wegschrijven - waar ik uiteindelijk de data weer in nodig heb voor een volgende stap.

Ik genereer nu de .csv door steeds over de verschillende tabellen te lopen, maar dat duurt echt belachelijk veel langer dan wanneer ik eerst via de DB alle data klaar zet. Juist die variabele kolommen, daar zit de vertraging in die ik dus op deze manier kan wegpoetsen.

[ Voor 31% gewijzigd door sus op 09-11-2025 15:29 ]

Beste antwoord (via sus op 09-11-2025 17:13)


  • Juup
  • Registratie: Februari 2000
  • Niet online
Nee, je database is niet goed genormaliseerd op deze manier.
Leesvoer: Wikipedia: Database normalization

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.

Alle reacties


Acties:
  • Beste antwoord

  • Juup
  • Registratie: Februari 2000
  • Niet online
Nee, je database is niet goed genormaliseerd op deze manier.
Leesvoer: Wikipedia: Database normalization

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 16:34

MueR

Admin Devschuur® & Discord

is niet lief

En hoe wil je dat doen zodra je over de column limit heen komt? Of duplicates krijgt? Of invalid names?

Dit is op alle vlakken een heel erg slecht idee.

Anyone who gets in between me and my morning coffee should be insecure.


  • Juup
  • Registratie: Februari 2000
  • Niet online
sus schreef op zondag 9 november 2025 @ 14:52:
Ik genereer nu de .csv door steeds over de verschillende tabellen te lopen, maar dat duurt echt belachelijk veel langer dan wanneer ik eerst via de DB alle data klaar zet. Juist die variabele kolommen, daar zit de vertraging in die ik dus op deze manier kan wegpoetsen.
Kun je de trage SQL query hier eens posten?
En de output van de explain van diezelfde query?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • sus
  • Registratie: September 2000
  • Laatst online: 23:46

sus

is druk :+

Topicstarter
De TS was een versimpeld voorbeeld om de vraag te kunnen stellen, het antwoord is gegeven; het kan vanuit MariaDB niet met een - ook voor mij - ontzettend goede onderbouwing. Maar, als je de vraag niet stelt… voor hetzelfde had het *wel* gekund.

Op de planning staat in de nabije toekomst een complete rewrite van dit hele gebeuren, waardoor ik er voor nu niet teveel tijd in ga steken. Ik had het idee dat voor de tussenliggende tijd op deze manier te versnellen, maar ook daar doe ik voor dit moment verder niets meer mee.

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 13:43
In principe kun je een query samenstellen doormiddel van een `CONCAT` statement en die query moet je dan nog los uitvoeren:
code:
1
SELECT CONCAT('ALTER TABLE `anderetabel` ADD ', NAMEN, ' VARCHAR(10) NULL DEFAULT NULL;') FROM `brontabel`;

Dit geeft je dan een alter statement per rij in de brontabel. Als je het in een enkel statement wilt, is dit mogelijk door nog een `GROUP_CONCAT` toe te voegen. Je zou zelfs ook een stored procedure kunnen maken die dit voor je doet, maar ik weet niet of dat een heel goed idee is ivm rechten en kans op het creëren van chaos.

  • Merethil
  • Registratie: December 2008
  • Laatst online: 16:24
sus schreef op zondag 9 november 2025 @ 14:52:
Ik heb een MariaDB draaien, waarin ik een tabel heb:

Namen:
IDNAMEN
1Jan
2Klaas
3Piet
4Hans
5Karel
Wat ik zou willen is dat ik een andere tabel nu extra kolommen kan geven, met de namen vanuit deze tabel

Dus:
ALTER TABLE `anderetabel`
ADD <waardes van kolom NAMEN>
VARCHAR(10) NULL DEFAULT NULL;

Ik doe het nu met 4 regels PHP, waar ik dus eerst de namen ophaal, in een variabele kiep en die dan een-voor-een toevoeg met een ALTER-commando, maar vraag me af of dit direct in de DB gedaan kan worden.

Als het niet kan, dan hou ik dus mijn stukje PHP actief :)

Even ter aanvulling n.a.v. de reactie van @Juup:
Klopt, het is totaal tegen de regels in. Maar, de tabel waar ik deze kolommen aan toe wil voegen is steeds eenmalig nodig, na gebruik wordt hij weer weggegooid (DROP). De rest van alle gegevens is uiteraard netjes volgens de regels opgezet. Door gebruik te maken van deze tabel kan ik echter heel veel sneller alle verschillende data naast elkaar zetten en dan in 1x als .csv wegschrijven - waar ik uiteindelijk de data weer in nodig heb voor een volgende stap.

Ik genereer nu de .csv door steeds over de verschillende tabellen te lopen, maar dat duurt echt belachelijk veel langer dan wanneer ik eerst via de DB alle data klaar zet. Juist die variabele kolommen, daar zit de vertraging in die ik dus op deze manier kan wegpoetsen.
Waarom doe je niet gewoon een query over meerdere tabellen naar je CSV toe? Dat lijkt me toch veel makkelijker dan steeds tabellen maken/aanpassen. Gewoon een kwestie van "SELECT * FROM TABEL1, TABEL2" of (liever) met een join. De output schrijf je dan weg naar de CSV.

Als het toch via een tabel moet omdat je bijvoorbeeld Mysqldump oid wil gebruiken:
Voor dit soort doeleinden gebruik je vaak temporary tables die alleen in memory beschikbaar zijn en die kan je maken door een "SELECT IN" uit te voeren met de query die de juiste tabellen raadpleegt en samenvoegt. Aan het einde selecteer je dan de data uit die temporary table en gebruik je die in je CSV. Doordat 't in memory gebeurt (als de tabel niet te groot is) heb je de snelheidsvoordelen zonder dat je steeds een andere tabel moet aanpassen.

Bovenstaand kan trouwens ook prima met een tabel op disk, maar dat is vaak al overkill als het maar een kleine hoeveelheid data is.
Ook kun je "CREATE TABLE .... SELECT" gebruiken om on the fly een tabel van meerdere datasets te maken en gebruiken; dan krijgt die tabel de namen en data van de select query die je over één of meerdere tabellen draait.
https://mariadb.com/docs/...ition/create/create-table
Pagina: 1