Wie bekomme ich die CREATE-Befehle in eine Tabelle

Hi,

SHOW CREATE TABLE tab;

zeigt mir den Create-Befehl, ich möchte ihn aber in ein Feld einer Tabelle eintragen. Oder wenigstens in eine Variable.

Gibt es in MySQL eine Möglichkeit?

Gruß Fralang

Moin, Fralang,

Du weißt aber schon, wie man einer Variablen einen String zuweist, oder?

Gruß Ralf

Moin moin,

Du weißt aber schon, wie man einer Variablen einen String
zuweist, oder?

Dann zeig mal wie das bei SHOW … sachen gehen soll.

SET @meinevar := SHOW CREATE TABLE tabelle

geht nicht .

Hi,

Dann zeig mal wie das bei SHOW … sachen gehen soll.

ich hätte fast schon eine Lösung gehabt: backups in ein File und dann:

LOAD DATA INFILE ‚c:\myFile‘ INTO TABLE tab;

das funktioniert, er lädt alles, was in dem File steht in ein Feld, je nach Einstellung, aber leeeeider geht das bei MySQL nicht in stored procedures.

Das wäre aber mein Anwendungszweck. In einer Prozedur möchte ich Adaptierungen der Tabellen durchführen.

Gruß Fralang

das problem mit meta daten :smile:

Du könntest natürlich auch die Infromations Schema Tabelle nehmen und dir dann dein create zusammen basteln. Denn SHOW nimmt ja auch nur die Werte aus daher :smile:

hab mich mal wieder fehl buchstabiert
informations schema tabelle
http://dev.mysql.com/doc/refman/5.1/de/information-s…

Hi Thomas,

ja, das ist die Idee:

mit INFORMATION SCHEMA COLUMNS krieg ich alles und kann daraus einen neuen CREATE (bzw. einen ALTER TABLE) zusmmensetzen. Ich hab jetzt auch gesehen, mit dem INFORMAION SCHEMA ROUTINES bekommt man auch die Pozeduren und Funktionen, die muss ich natürlich auch anpassen.

Ich hatte jetzt vor, ein Backup zu machen und darin mit einem externen Programm die Aenderungen durchzuführen, dann als Script wieder zu laden und auszuführen.

Worum´s geht, sag ich auch: Mehrsprachigkeit. Zur deutschen Version sollen beliebe Sprachen zur gleichzeitigen Benutzung kommen, etwa englisch und chinesisch. Zeichensätze kann man nur pro Spalte angeben, daher eine Spalte pro Sprache für jedes Textfeld. Diese Felder generiere ich dann automatisch. Die Prozeduren liefern dann mit SELECT … WHEN … das Feld in der jeweils gewünschten Sprache.

Ja, super, ich danke dir herzlichst,
Franz

Moin moin,

nur pro Spalte angeben, daher eine Spalte pro Sprache für
jedes Textfeld. Diese Felder generiere ich dann automatisch.

ich hätte einfach pro sprache dann eine tabelle jeweils gleichem index .

Auf meta daten sollte man einfach nicht zugreifen müssen :smile:

Aber wenns funktioniert ist es ok , aber nicht wundern wenn der Lehrer dennoch eine schlechte note vergiebt :smile: . Optimierung kommt dann halt später .

Moin moin,

Auf meta daten sollte man einfach nicht zugreifen müssen :smile:

das will ich doch nochmal erklären.

In einem unternehmen wo in abteilung X ein programm läuft was auf meta daten zugreift , hebelt jegliche sicherheit aus. Ich muss offt soviel rechte vergeben das abteilung X nun mehr sehen könnte. Damit ist dann auch schon ein Loch entstanden. Für den eigengebrauch ok. Aber als laufendes Programm sollte man so wenig zugriffsrechte wie möglich brauchen. Nicht das man mit Server-Root einloggen muss , wo eigentlich nur ein arbeiter seine arbeit tun soll (mehrsprachiger übersetzer) :smile:

-)

Meta daten
Hi,

ich hätte einfach pro sprache dann eine tabelle jeweils gleichem index .

Krieg ich da nicht Redundanz in das System? Wenn eine Tabelle 30 Felder hat, hat sie vielleicht 10 sprachabhängige Felder. Speichere ich dann die anderen 20 mehrfach?

Ich hab, glaube ich, jetzt nicht alles ganz verstanden.

Auf meta daten sollte man einfach nicht zugreifen müssen :smile:

Welche sind die meta daten? Wodurch ergibt sich ein Sicherheitsproblem?

(mehrsprachiger übersetzer) :smile:

Irgendwer muss natürlich übersetzen. Ich gebe vielleicht pro Testfeld noch ein Flag „noch nicht übersetzt“ hinzu, um dem Übersetzer das Auffinden der neuen oder geänderten Teste zu erleichtern und dem einfachen Anwender zu sagen, hier fehlt noch was.

Gruß Franz

Moin moin,

Krieg ich da nicht Redundanz in das System? Wenn eine Tabelle
30 Felder hat, hat sie vielleicht 10 sprachabhängige Felder.
Speichere ich dann die anderen 20 mehrfach?

Die Frage ist natürlich wie du es verwenden willst.

Wenn die Tabelle nicht um eine Sprache erweitert werden soll und eh nur 1 Wort pro Übersetzung vorhanden sein soll dann
kann man gerne feste feldnamen für die sprachen nehmen .

Willst du aber das System recht individuell halten , dann ist eine andere Struktur besser.

z.b.

--
-- Tabellenstruktur für Tabelle `word_index`
--

CREATE TABLE IF NOT EXISTS `word_index` (
 `idx` int(11) NOT NULL AUTO\_INCREMENT,
 `bedeutung` TEXT NOT NULL,
 PRIMARY KEY (`idx`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO\_INCREMENT=6 ;

--
-- Daten für Tabelle `word_index`
--

INSERT INTO `word_index` (`idx`) VALUES
(1,'Körper , wird zum Gehen benutzt'),
(2,'Bau für Menschen'),
(3,'Abgetrennter Bereich in einem Bau für Menschen'),
(4,'Eine Fall Situation'),
(5,'Zum Messen eines Zeittaktes')
;


--
-- Tabellenstruktur für Tabelle `deutsch`
--

CREATE TABLE IF NOT EXISTS `deutsch` (
 `idx` int(11) NOT NULL,
 `wort` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `deutsch`
--

INSERT INTO `deutsch` (`idx`, `wort`) VALUES
(1, 'Bein'),
(2, 'Haus'),
(2, 'Wohnung'),
(4, 'Beispiel');


--
-- Tabellenstruktur für Tabelle `englisch`
--

CREATE TABLE IF NOT EXISTS `englisch` (
 `idx` int(11) NOT NULL,
 `wort` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `englisch`
--

INSERT INTO `englisch` (`idx`, `wort`) VALUES
(1, 'Leg'),
(2, 'Flat'),
(3, 'World')
(3, 'Earth');

Erklärung :

world_index dient als gesammt index . wenn ein neues wort in einer der sprachen hinzu kommt dann wird der index erhöht und das wort mit jeweiligem index in die sprachtabelle eingetragen.
bei diesem beispiel gibt es mehrere beduetungen für das selbe wort:

Beispiel :
Querys :

Alles was da ist Anzeigen

SELECT EN.wort as Englisch , DE.wort as Deutsch FROM word\_index as IDX 
LEFT OUTER JOIN englisch as EN 
ON IDX.idx = EN.idx
LEFT OUTER JOIN deutsch as DE 
ON IDX.idx = DE.idx

Englisch | Deutsch
---------------------
Leg Bein
Flat Haus
Flat Wohnung
World NULL
Earth NULL
NULL Beispiel
NULL NULL

Eine Abfrage die nur vollständig übersetzte Wörter anzeigt.

SELECT EN.wort AS Englisch, DE.wort AS Deutsch
FROM word\_index AS IDX
INNER JOIN englisch AS EN ON IDX.idx = EN.idx
INNER JOIN deutsch AS DE ON IDX.idx = DE.idx

Englisch | Deutsch
---------------------
Leg Bein
Flat Haus
Flat Wohnung

wie du siehst , jede tabelle wird gleich angesprochen , immer mit dem feld wort :smile:

Man kann das ganze natürlich auch mit primary keys in den sprach tabellen machen , wenn es nur eine Bedeutung gibt.
Aber wie so offt ist bei einem Wörterbuch einiges Doppeldeutig :smile:

Du siehst , bei dem System kann man auch schon mal Bedeutungen vorgeben
ohne das man überhaupt weiss in welcher sprache auch immer das mal übersetzt wird :smile:

Man kann auch alles in eine Tabelle fummeln mit einem Feld Sprache.
Es entscheidet wirklich der Anwendungsfall . Wenn ich die Sprache als Daten brauche ist es nicht gut diese Information in einen tabellen namen oder Feldnamen zu packen.

Übrigens Redundanz :
Und redundant heist nicht das ich eine tabelle jungen und eine tabelle mädchen machen muss damit ich mir ein feld geschlecht spare.

Inga Frau
Ines Frau
Gotha Man
.
.
.

Frau ist hier schon richtig (und auch nicht doppelt oder überflüssig oder zuviel). Solange der Bezug stimmt.
Arbeite ich aber sowieso nur mit Frau , brauch ich die Angabe nicht ,
da reicht es dann alle Frauen in einer Tabelle zu erfassen . Aber die Daten wären nicht redundant. Denn will ich dieses mit anderen daten verknüpfen , finde ich im Feld Geschlecht die benötigte Angabe. Das wäre dann sinvoller als nur der tabelle selber den namen des geschlechtes zu verpassen :smile: Immerhin will Frau wissen das sie Frau ist und nicht das sie ein Geschlecht hat :smile:

was aber redundant wäre ist sowas wie :

Inga Berlin Frau
Ines Hamburg Frau

und in einer anderen Tabelle :

Inga Hermes Frau
Ines Ollahh Frau

Jetzt haben wir den Bezug Frau doppelt aufgeführt für ein und dieselbe Person.

Fazit: Denk vorher nach wie flexibel das System sein muss. Dann handeln :smile:

Re: mein fehler :smile:

Auf meta daten sollte man einfach nicht zugreifen müssen :smile:

Welche sind die meta daten? Wodurch ergibt sich ein Sicherheitsproblem?

Oh da bin ich mit was anderem durcheinader gekommen. Ich bezog es noch auf SHOW und wie SHOW im MySql ausgeführt wird.

Hier die Beschreibung wie es zum Glück schon ist :
Each MySQL user has the right to access these tables…

Hi Thomas,

das mit den Sprachtabellen und Indizes für die Wörter wäre ja recht elegant (auch keine Redundanz), aber der Zugriff wird sehr kompliziert.

Ich habe z.B. myTab mit zwei Inidizes auf Wörter und zwei Zahlen. Nun möchte ich die Tabelle auf deutsch:

SET @SprachTab = ‚deutsch‘

SELECT myFunc(@Sprachtab,idxWort1), Zahl1,
myFunc(@Sprachtab,idxWort2), Zahl2 FROM myTab JOIN @Sprachtab;

Nach JOIN darf keine Variable stehen, aber das kann man mit CONCAT, PREPARE, EXECUTE lösen.

In einem Prepared-Statement darf aber keine Funktion aufgerufen werden. Abgesehen davon soll das ganze in einer Stored Procedure laufen: wiederum kein dynamisches SQL möglich.

Mit JOINs:

SELECT a.Wort, Zahl1,
b.Wort, Zahl2 FROM myTab
JOIN deutsch AS a ON myTab.idx1 = deutsch.idx
JOIN deutsch AS b ON myTab.idx2 = deutsch.idx;

Anstatt mit ‚deutsch‘ wird man wieder mit PREPARE arbeiten. Aber für jedes sprachabhängige Feld ist ein JOIN notwendig (es können viele sein). Man könnte auch ein Problem bekommen, falls für etwas spezielles ein Cursor aufgesetzt werden muss (eine Schleife), das geht dann wieder in einem Prepared-Statement nicht.

Mit allen Wörtern innerhalb von myTab:

SELECT CASE @Sprache WHEN „de“ THEN Wort1_de
WHEN „en“ THEN Wort1_en as Wort1,
Zahl1,
CASE @Sprache WHEN „de“ THEN Wort2_de
WHEN „en“ THEN Wort2_en as Wort2,
Zahl2 FROM myTab;

Wäre das nicht das einfachste und effizienteste? Die CREATE-Befehle und SELECT-Anweisungen werden bei Intallation des Systems generiert.

Gruß Fralang

Dann wäre es doch gleich einfacher alles in eine Tabelle zu tun .
Von mir aus ein View der alle Sprachen zusammen führt.

Und dann brauchst du nur noch auf den view select mit tabelleAlleSprachen das Feld Sprache mit vergleichen.

Sorry aber mir ist das konkrete Beispiel noch nicht klar.
Ich weiss noch nicht was du wirklich erreichen willst ?
Wieso auf einmal ‚en‘ oder ‚de‘ ? Woher kommt das ?

Sorry aber mir ist das konkrete Beispiel noch nicht klar.
Ich weiss noch nicht was du wirklich erreichen willst ?

Es ist eine recht komplexe Anwendung, vielleicht 50 Tabellen, jede dieser Tabellen kann mehrere sprachabhängige Felder enthalten. In einer großen Tabelle vielleicht 20 oder 30. Dann bräuchte ich 30 joins, um alle Übersetzungen aus den Tabellen zu holen.

Das System soll gleichzeitig die Daten in mehreren Sprachen verwalten können. Wenn ein Japaner sich an seinen Computer setzt, dann möchte er die Daten in seiner Sprache sehen, wenn, oder besseres Beispiel: die Schweiz. Jeder Anwender möchte die Daten in seiner Sprache sehen. Wenn neue Daten eingegeben werden, muss natürlich zusätzlich ein Dolmetscher ans Werk.

Wieso auf einmal ‚en‘ oder ‚de‘ ? Woher kommt das ?

Das sind die ISO-Sprachcodes.

Dann wäre es doch gleich einfacher alles in eine Tabelle zu
tun .

Ja, das denke ich, vielleicht jeweils nur eine Tabelle. Wenn ein System in 3 Sprachen ausgeliefert werden soll, dann mache ich aus den 20 sprachabhängigen Feldern der TabelleX 60 Felder mit den Bezeichnungen: _Feldname.

Mit SELECT CASE abzufragen, wobei alle CREATE und SELECT-Anweisungen pro Anwendung durch eine Prozedur unter Vorgabe der gewünschten Sprachen automatisch generiert werden.

Ich hoffe, ich hab’s richtig hingekriegt mit der Erklärung.

Gruß Fralang

Hallo FraLang,
ich kann ja nur Vermutungen anstellen und will dir auch nicht zu nahe treten, aber ziemlich oft kommen solche Probleme von einer schlechten bzw. ungenügenden Normalisierung.
Wie gesagt, nur ne Vermutung, weil ja nirgendwo der Aufbau deiner Tabellen klar wird. Vielleicht habe ich es ja auch übersehen, aber bis jetzt ist nur klar, daß es irgendwie um Übersetzungen bzw. Internationalisierungen geht. Vielleicht wäre ein Beispiel „in klein“ hilfreich.

Viele Grüße
Marvin

Moin moin,

ich aus den 20 sprachabhängigen Feldern der TabelleX 60 Felder
mit den Bezeichnungen: _Feldname.

nein , wieso wieder feldname mit infos füllen ?

ich meine
aus:

idx basis deutsch english 
1 eins eins one
2 drei drei three

wird:

basis word sprache
eins eins de
eins one en
drei drei de
drei three en

Übrigens was ich noch fragen wollte :
Du willst doch nur in eine Sprache übersetzen oder liesst der alle sprachen gleichzeitig ?

Also ,

basis word sprache
eins eins de
eins one en
drei drei de
drei three en

wenn du eine default sprache hast und eine weitere die ziel sprache ist.
wäre das

SELECT word FROM uebersetzer WHERE sprache in (‚en‘,‚de‘) AND basis = ‚eins‘

oder schreibt jeder seine infos anders und du musst erstmal die basis finden ?

also jeder produziert in seiner sprache und du musst zur basis die neue sprache finden ?

Hi Thomas,

nein , wieso wieder feldname mit infos füllen ?

Das habe ich aber doch vor, die einfachste Version. Eine Tabelle enthält pro Zeile alle Werte in allen gwünschten Sprachen. Eine Tabelle könnte haben:

de_Feld1, en_Feld1, fr_Feld1, de_Feld2, en_Feld2, fr_Feld2

Die Abfrage sieht dann so aus:

CASE lang WHEN „de“
SELECT
de_Feld1 as Feld1,
de_Feld2 as Feld2 from myTab;

CASE lang WHEN „en“
SELECT
en_Feld1 as Feld1,
en_Feld2 as Feld2 from myTab;
usw.

Ich habe nicht viel Arbeit, das zu schreiben, weil ich aus einer ursprünglichen Informationstabelle alle Creates und Abfragen automatisch generiere.

idx basis deutsch english
1 eins eins one
2 drei drei three

wird:

basis word sprache
eins eins de
eins one en
drei drei de
drei three en

Wenn ich über Sprachtabellen die Übersetzungen zuordnen möchte, brauche ich einen JOIN pro Feld. Beispiel:

SELECT a.Sprachtabelle.word,
b.Sprachtabelle.word from myTab
JOIN Sprachtabelle as a
ON myTab.Feld1 = a.basis and a.sprache=lang
JOIN Sprachtabelle as b
ON myTab.Feld1 = b.basis and b.sprache=lang

Pro sprachabhängiges Feld ein Join. Ich denke, das ist zu aufwändig.

Übrigens was ich noch fragen wollte :
Du willst doch nur in eine Sprache übersetzen oder liesst der
alle sprachen gleichzeitig ?

Ein Pole und ein Russe sitzen nebeneinander, jeder an seinem PC, sie wollen das gleiche Projekt einsehen, aber jeder in seiner Sprache.

Gruß Fralang