Seite 1 von 2

MySQL Befehl über 'X' Tabellen

Verfasst: 01.10.2008 12:39
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

Verfasst: 01.10.2008 15:45
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 ;

Verfasst: 01.10.2008 15:51
von kird1
ja, schon......aber wohl nur als Ersatz bei Inhalten (%.......%)
in der Abfrage ist es ebenso syntaktisch falsch wie *

Verfasst: 01.10.2008 16:16
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.

Verfasst: 01.10.2008 17:17
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.

Verfasst: 01.10.2008 17:45
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';

Verfasst: 01.10.2008 17:51
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.

Verfasst: 01.10.2008 17:55
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.)

Verfasst: 01.10.2008 18:03
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 ;)

Verfasst: 01.10.2008 18:37
von kird1
Besten Dank! Damit läßt sich arbeiten........ ;)