MySQL Befehl über 'X' Tabellen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
kird1
Mitglied
Beiträge: 134
Registriert: 12.10.2004 20:09

MySQL Befehl über 'X' Tabellen

Beitrag von kird1 »

Hallo,

ich habe eine Datenbank mit mehren tausend Tabellen, jede zehnte davon heißt (Präfix)_config.
Ich möchte in allen gleichzeitig eine Spalte bearbeiten - geht das überhaupt direkt auf der DB? Oder nur über php oder cgi?

Beispiel:
UPDATE *_config SET config_value = '<img src="impressum.jpg">' WHERE CONVERT( *_config.config_name USING utf8 ) = 'site_desc' LIMIT 1 ;

(mit den Wildcards geht´s halt nicht........)

Danke!
kird1
Benutzeravatar
StarWolf3000
Mitglied
Beiträge: 1019
Registriert: 25.07.2005 10:20
Wohnort: Stolpen
Kontaktdaten:

Beitrag von StarWolf3000 »

MySQL kennt noch eine andere Art von Wildcard, den %-Operator, der anstelle des *-Operators benutzt werden sollte, da * nicht immer oder gar nicht funktioniert.

Code: Alles auswählen

UPDATE %_config SET config_value = '<img src="impressum.jpg">' WHERE CONVERT( %_config.config_name USING utf8 ) = 'site_desc' LIMIT 1 ;
MOD-Einbauhilfe und Installationen über ICQ, TeamSpeak 2/3 und TeamViewer. Support nur im Forum, eingeschränkt per TeamViewer, aber nicht mehr per PN! • KB:knigge
Benutzeravatar
kird1
Mitglied
Beiträge: 134
Registriert: 12.10.2004 20:09

Beitrag von kird1 »

ja, schon......aber wohl nur als Ersatz bei Inhalten (%.......%)
in der Abfrage ist es ebenso syntaktisch falsch wie *
Grüße
kird1
Benutzeravatar
StarWolf3000
Mitglied
Beiträge: 1019
Registriert: 25.07.2005 10:20
Wohnort: Stolpen
Kontaktdaten:

Beitrag von StarWolf3000 »

Dann ist es nicht möglich, Wildcards werden anscheinend nicht in der Tabellen-Auswahl berücksichtigt bzw. erzeugen sogar einen Fehler. Da bleibt nur noch, jede Tabelle einzeln aufzuführen und dann bei jeder über eine Referenzvariable tX.config_name bzw. tX.config_value darauf zuzugreifen.
MOD-Einbauhilfe und Installationen über ICQ, TeamSpeak 2/3 und TeamViewer. Support nur im Forum, eingeschränkt per TeamViewer, aber nicht mehr per PN! • KB:knigge
BB-BF-BM
Mitglied
Beiträge: 2179
Registriert: 28.10.2005 16:38
Wohnort: Essen

Beitrag von BB-BF-BM »

Hallo!

Gemäß Dokumentation ist es aber zumindest möglich, alle Tabellen mit einem Befehl zu ändern ("UPDATE table1, table2, table3, ... SET ..."). Zwar müssen sie trotzdem einzeln aufgeführt werden, aber man muss nicht mehrere tausend Abfragen durchführen.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Aber wieso liest Du nicht sämtliche Namen der Tabellen *config aus, schreibst das in ein Array und mit diesem Array baust Du eine SQL Query, die die Daten in den Tabellen (diesmal mit explizitem Namen) ändert.

Tip:

Code: Alles auswählen

SHOW TABLES LIKE '%config';
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Es ist auch möglich aus einer Datenbank die existierenden Tabellen auszulesen:

Code: Alles auswählen

$sql = "SHOW TABLES";
$tables = $db->sql($sql);
$i = 0;
while($table = $db->result($tables,$i))
{
	$i++;
//in $table steht jetzt ein Tabellenname aus deiner Tabelle, den kannst du dann beliebig z.B. per preg_match abgleichen
}
Ich nutze das z.B. so (Auszug):

Code: Alles auswählen

$tabellen_muster = 'special_stats';
$exclude = array();
$query_muster = array();
$query_muster[] = "UPDATE {TABELLEN_NAME} SET special_id = 3 WHERE special_stats_name = 'dm07'";

$sql = "SHOW TABLES";
$tables = $db->sql($sql);
$i = 0;
while($table = $db->result($tables,$i))
{
	$i++;
	//$table = $table[0];
	if(strpos($table, $tabellen_muster) !== FALSE && !in_array($table,$exclude))
	{
		foreach($query_muster as $query_id => $query)
		{
			
			$query = str_replace('{TABELLEN_NAME}',$table,$query);
			$db->sql($query) or message_add(ERROR,'Fehler beim Ausf&uuml;hren des Queries ID '. $query_id . ' Tabelle '.$table,'Fehler',__LINE__,__FILE__,$query);
		}
	}
}
Das Updated mir dann immer gleich alle 3 Tabellen special_stats_offense, special_stats_defense, special_stats_pitching auf einmal. Ist natürlich in dem Fall auch einfacher machbar, ich hatte das aber ursprünglich für 10 Tabellen gleichzeitig geschrieben da war das schon sinnvoll. Lässt sich natürlich noch optimieren.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Dann mach doch gleich

Code: Alles auswählen

SHOW TABLES LIKE 'special_stats_%';
Dann bist Du (fast) alle Sorgen los (zumindest was den Tabellennamen betrifft.)
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Da haben wir mal wieder fast gleichzeitig gepostet...

Nein macht bei mir keinen Sinn da das Skript (das hier nur in Auszügen steht) bei mir gleich einiges an unterschiedlichen Tabellen updaten soll. Ich habe da noch eine ca. zwei Bildschirmseiten lange Liste an SQL Befehlen zwischen die ich nicht für soo wichtig hielt sie hier zu posten ;) Da sind dann auch noch andere Tabellen bei als 'special_stats_%'. Trotzdem danke ;)
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
kird1
Mitglied
Beiträge: 134
Registriert: 12.10.2004 20:09

Beitrag von kird1 »

Besten Dank! Damit läßt sich arbeiten........ ;)
Grüße
kird1
Antworten

Zurück zu „Coding & Technik“