auto_increment
am 06.10.2004 15:22:56 von Bernd Kuegle
Habe folgendes Problem: Lade eine csv-Datei in eine mySQL-DB mit 3 Feldern:
1. ID (ID ist UNIQUE)
2. Datum
3. Titel
In der csv-Datei kann ich die ID nicht angeben, da in der DB bereits
verschiedene ID´s vorhanden sind.
Wenn ich in der csv-Datei die ID leer lasse, krieg ich nach dem ersten
geladenen Datensatz eine Fehlermeldung (logisch). Aber wie schaffe ich es,
dass für ID´s, welche ich per csv-Datei hinzufügen will, trotzdem eine
fortlaufende Nummer vergeben wird?
Thanks to all
Re: auto_increment
am 06.10.2004 15:59:12 von Johannes Vogel
Hallo Bernd
Bernd Kuegle wrote:
> Habe folgendes Problem: Lade eine csv-Datei in eine mySQL-DB mit 3 Feldern:
> 1. ID (ID ist UNIQUE)
> 2. Datum
> 3. Titel
> In der csv-Datei kann ich die ID nicht angeben, da in der DB bereits
> verschiedene ID´s vorhanden sind.
> Wenn ich in der csv-Datei die ID leer lasse, krieg ich nach dem ersten
> geladenen Datensatz eine Fehlermeldung (logisch). Aber wie schaffe ich es,
> dass für ID´s, welche ich per csv-Datei hinzufügen will, trotzdem eine
> fortlaufende Nummer vergeben wird?
Wenn ich das lese, meine ich, dass du eine reine MySQL-Lösung suchst.
Hier bist du aber in der dcl.php.datenbanken, also gehe ich davon aus,
dass du PHP zur Verfügung hast.
Du könntest also die csv-Datei einfach per PHP einlesen, die ID
ignorieren und damit eine extended oder viele INSERT-Anweisungen
generieren. In etwa so:
//------------------------------------------------
$sql = "insert into tabelle (datum, titel) values ";
$handle = fopen($csvfile, 'r');
while (($data = fgetcsv($handle, 1000, ',')) !== false) {
$sql .= "('{$data[2]}', '{$data[3]}'),";
}
fclose($handle);
$sql = substr($sql,0,-1);
mysql_query($sql); print mysql_error();
?>
//------------------------------------------------
Falls du doch eine reine MySQL-Variane suchst, auch die gibt's:
Bspw. könntest du deiner Tabelle ein unnützes Feld (notused) hinzufügen,
in welches du die IDs aus der CSV reinschreibst. Dieses ist dann nicht
auto_increment:
load data infile 'daten.csv' into table tabelle (notused, datum, titel);
HTH, Johannes
HTH, Johannes
Re: auto_increment
am 06.10.2004 16:20:13 von Ulrich Nehls
Hallo Bernd, Johannes,
> Wenn ich das lese, meine ich, dass du eine reine MySQL-Lösung suchst.
Du suchst Trigger und Generatoren (keine Ahnung ob es das in Mysql gibt).
Das hat der Firebird (auch Open Source; richtig - der, der sich mit dem
Browserprojekt um den Namen gestrubbelt hat); falls du also nicht auf
Mysql festgelegt bist, wäre das eine gute (und serverseitige)
Möglichkeit. http://www.ibphoenix.com/
Gruß,
UN
Re: auto_increment
am 06.10.2004 17:32:20 von Bernd Kuegle
"Johannes Vogel" schrieb im Newsbeitrag
news:ck0tqn$2do$1@newshispeed.ch...
> Hallo Bernd
>
> Bernd Kuegle wrote:
> > Habe folgendes Problem: Lade eine csv-Datei in eine mySQL-DB mit 3
Feldern:
> > 1. ID (ID ist UNIQUE)
> > 2. Datum
> > 3. Titel
> > In der csv-Datei kann ich die ID nicht angeben, da in der DB bereits
> > verschiedene ID´s vorhanden sind.
> > Wenn ich in der csv-Datei die ID leer lasse, krieg ich nach dem ersten
> > geladenen Datensatz eine Fehlermeldung (logisch). Aber wie schaffe ich
es,
> > dass für ID´s, welche ich per csv-Datei hinzufügen will, trotzdem eine
> > fortlaufende Nummer vergeben wird?
>
> Wenn ich das lese, meine ich, dass du eine reine MySQL-Lösung suchst.
> Hier bist du aber in der dcl.php.datenbanken, also gehe ich davon aus,
> dass du PHP zur Verfügung hast.
>
> Du könntest also die csv-Datei einfach per PHP einlesen, die ID
> ignorieren und damit eine extended oder viele INSERT-Anweisungen
> generieren. In etwa so:
>
> //------------------------------------------------
> $sql = "insert into tabelle (datum, titel) values ";
> $handle = fopen($csvfile, 'r');
> while (($data = fgetcsv($handle, 1000, ',')) !== false) {
> $sql .= "('{$data[2]}', '{$data[3]}'),";
> }
> fclose($handle);
> $sql = substr($sql,0,-1);
> mysql_query($sql); print mysql_error();
> ?>
> //------------------------------------------------
>
> Falls du doch eine reine MySQL-Variane suchst, auch die gibt's:
> Bspw. könntest du deiner Tabelle ein unnützes Feld (notused) hinzufügen,
> in welches du die IDs aus der CSV reinschreibst. Dieses ist dann nicht
> auto_increment:
>
> load data infile 'daten.csv' into table tabelle (notused, datum, titel);
>
> HTH, Johannes
>
> HTH, Johannes
Hi Johannes!
Vielen Dank! Paßt schon. Hatte vergessen zu erwähnen, das ich das csv-File
mittels php hochlade und einfüge. Werde deinen Vorschlag ausprobieren.
Verstehe nur noch nicht ganz, was das "substr" soll, da du ja in deinem
Beispiel sowieso jedes Feld einzeln ansprichst?
Grüße
Bernd
Re: auto_increment
am 06.10.2004 17:49:26 von Johannes Vogel
Hi Bernd
Bernd Kuegle wrote:
> "Johannes Vogel" schrieb im Newsbeitrag
> news:ck0tqn$2do$1@newshispeed.ch...
>>//------------------------------------------------
>>$sql = "insert into tabelle (datum, titel) values ";
>>$handle = fopen($csvfile, 'r');
>>while (($data = fgetcsv($handle, 1000, ',')) !== false) {
>> $sql .= "('{$data[2]}', '{$data[3]}'),";
>>}
>>fclose($handle);
>>$sql = substr($sql,0,-1);
>>mysql_query($sql); print mysql_error();
>>?>
>>//------------------------------------------------
> Vielen Dank! Paßt schon. Hatte vergessen zu erwähnen, das ich das csv-File
> mittels php hochlade und einfüge. Werde deinen Vorschlag ausprobieren.
Naja, wenn du das Script verwendest, dann ist diese Gruppe der richtige
Ort. Ansonsten möchte ich dir de.comp.datenbanken.mysql vorstellen.
> Verstehe nur noch nicht ganz, was das "substr" soll, da du ja in deinem
> Beispiel sowieso jedes Feld einzeln ansprichst?
Schau auf das Komma zwischen den Datensätzen innerhalb der Schleife. Am
Schluss ist eines zuviel da. Das muss da wieder weg.
HTH, Johannes
Re: auto_increment
am 06.10.2004 22:46:38 von Niels Braczek
Johannes Vogel schrieb:
> Bernd Kuegle wrote:
>> Verstehe nur noch nicht ganz, was das "substr" soll, da du ja in
>> deinem Beispiel sowieso jedes Feld einzeln ansprichst?
>
> Schau auf das Komma zwischen den Datensätzen innerhalb der Schleife.
> Am Schluss ist eines zuviel da. Das muss da wieder weg.
Deshalb sammelt man die Daten in einem Array, das man anschließend mit
implode() in einen String umformt. Das ist wesentlich kürzer, klarer und
schneller.
MfG
Niels
--
> Bitte FAQ lesen und Shift-Taste nutzen.
wieso shift-taste? versteh das nicht so ganz.
[Alexander Fleischer in dclpm]
Re: auto_increment
am 07.10.2004 07:17:51 von Johannes Vogel
Hi Niels
Niels Braczek wrote:
> Johannes Vogel schrieb:
>>Bernd Kuegle wrote:
>>>Verstehe nur noch nicht ganz, was das "substr" soll, da du ja in
>>>deinem Beispiel sowieso jedes Feld einzeln ansprichst?
>>Schau auf das Komma zwischen den Datensätzen innerhalb der Schleife.
>>Am Schluss ist eines zuviel da. Das muss da wieder weg.
> Deshalb sammelt man die Daten in einem Array, das man anschließend mit
> implode() in einen String umformt. Das ist wesentlich kürzer, klarer und
> schneller.
Weshalb kürzer?
Ich benötige genau gleich viele Zeilen, ob ich direkt den String ergänze
und dann um ein Zeichen kürze, oder ob ich ein Array ergänze und dieses
implodiere.
Weshalb klarer?
Schlussendlich will ich einen String vervollständigen. Das sage ich so -
von anfang an. Meine Daten von der Datenbank in einen Array zu
übernehmen und dann implodiert in den String einbauen ist doch nicht klarer?
Und weshalb schneller?
Array-Zugriffe sind unbedingt schneller als Stringergänzungen. Ausserdem
muss am Schluss nochmals das gesamte Array angesprochen werden, in
meinem Fall nur der Datenbereich um eins gekürzt werden.
Ich lasse mich aber gerne mit stichhaltigen Argumenten eines Besseren
belehren.
Johannes
Re: auto_increment
am 07.10.2004 15:14:44 von Niels Braczek
Johannes Vogel schrieb:
> Niels Braczek wrote:
>> Deshalb sammelt man die Daten in einem Array, das man anschließend
>> mit implode() in einen String umformt. Das ist wesentlich kürzer,
>> klarer und schneller.
>
> Weshalb kürzer?
$rawdata = range(0,100);
$data = '';
for ($i=0; $i
$data.= $rawdata[$i].',';
}
$str = substr($data,0,-1);
// vs.
$data = array();
for ($i=0; $i
$data[] = $rawdata[$i];
}
$str = implode(',',$data);
Auf den ersten Blick gleich lang (in Zeilen), benötigt jedoch eine
Operation weniger (im Schleifenkörper), daher kürzer.
> Weshalb klarer?
> Schlussendlich will ich einen String vervollständigen. Das sage ich
> so - von anfang an.
Nein, du willst eine Liste kommasepariert in einem String
zusammenfassen. Dein 'String vervollständigen' ist das von dir gewählte
Mittel, nicht der Zweck.
> Und weshalb schneller?
Variante 1 (substr) Ø 4,5s/10000 Durchläufe
Variante 2 (implode) Ø 4,1s/10000 Durchläufe
Variante 2 ist fast 10% schneller.
MfG
Niels
--
Microsoft is not the answer - Microsoft is the question.
The answer is NO!