PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zweideutige Spaltennamen in Mysql CREATE TABLE ... SELECT umgehen



dumm'
10.05.2004, 17:45
Man nehme x Tabellen. Etwa ...


CREATE TABLE x1 (
id INT ...
);

CREATE TABLE x2 (
id INT ...
);

... und wende darauf ein SELECT an, welches das Ergebnis in einem neuen Table unterbringt ...


CREATE TABLE `new_tbl` SELECT a.*, b.* FROM x1 as a, x2 as b

... und tada!


Duplicate column name 'id'

Sollte nichts unbekanntes sein. Allerdings stoert das ungemein. Besonders weil es sich nicht um 2 Tabellen, sondern um 6 handelt, alle unterschiedliche Attribute haben und davon diverse. a.a, a.b, a.c ... z.z kommt also nur ungern in Frage. :p

Um mich da jetzt rauszuwinden, warum ich dann auch mehrmals das Attribut id in verschiedenen Taballen verwende, sei gesagt, dass die Werte von id auch ueberall gleich sind. Also id ein Teil des primarerschluessels ist. 'id' einmal zu haben wuerde ausreichen. Ich weiss nur nicht wie. Ich sehe weder eine Moeglichkeit einzelne Attribute auszuschliessen, noch die Attribute eindeutig in der neuen Tabelle unterzubringen. :)

mfg

Bunny
10.05.2004, 19:06
Liegen die Spalten nicht fest, die du auswählen willst?


CREATE TABLE `new_tbl` SELECT a.id, a.a ... FROM x1 as a, x2 as b

dumm'
10.05.2004, 19:25
Jein. Mir sind sie natuerlich bekannt. Meinem Programm zu diesem Zeitpunkt allerdings nicht. :/ Aber da ich vermutlich keine andere Wahl habe als alle noetigen Attribute anzugeben, muss ich mich anscheinend mit der Moeglichkeit arrangieren. :)

Trotzdem danke!

mfg

Bunny
10.05.2004, 21:46
:/ Aber da ich vermutlich keine andere Wahl habe als alle noetigen Attribute anzugeben, muss ich mich anscheinend mit der Moeglichkeit arrangieren. :)

Trotzdem danke!

mfg

Das ganze kannst du natürlich von deinem Programm automatisch mit EXPLAIN ausfüllen lassen:


#!/usr/bin/env ruby

require "mysql"

mysql = Mysql.new("localhost", "bunny", "bunny", "bunny")

tables = %w[x1 x2]
fields = {}
str_fields = ""

tables.each { |name|
query = mysql.query "EXPLAIN "+name
query.each_hash { |row|
fields.update({row['Field'] => name})
}
}

fields.each { |key, value|
str_fields << value << "." << key << ", "
}

str_fields.chomp!(", ")
mysql.query("CREATE TABLE `new_tbl` SELECT "+str_fields+" FROM "+tables.join(", " ))

mysql.close

dumm'
10.05.2004, 23:59
neee ... das waere zu abgespace'd. *g* :) ABER es waere eine Moeglichkeit. Ich gebe jetzt/sobald ich es umgesetzt habe die Variablen so separat vom Query an wie moeglich. Das wird schon klappen. Irgendwie. ;)

mfg