Empfehlungen: Erweiterte Suche

Primary Key selbst vergeben

Datenbankobjekte strukturieren und validieren

Primary Key selbst vergeben

Beitragvon artoros » Do 26. Nov 2009, 16:58

Hallo!!!

Ich habe eine Frage zum Speichern von Daten:

Ich möchte die Daten für ein Model nicht über ein Web-Formular eingeben, sondern über einen Import (CSV-Datei).

Das klappt auch alles soweit wunderbar - ich lade die Daten aus der CSV-Datei, erstelle an Hand derer ein $data-Array, das ich dann der saveAll-Funktion übergebe.

Es gibt jetzt jedoch ein Problem: Die ID der Datensätze kann ich nicht aus der Import-Datei übernehmen. Selbst wenn ich im Model bzw. im $data-Array den Wert für id setze, wird dieser in der INSERT-Anweisung von Cake nicht gesetzt. (obwohl z.B. mySQL das duchaus zulassen würde).

Das ist ziemlich blöd, weil ich in der Import-Datei auch Relationen (parent_id) angebe und dafür muss ich die jeweiligen IDs der Datensätze schon beim Anlegen der Import-Datei kennen.

Ok, das war jetzt wahrscheinlich alles viel zu kompliziert erklärt. :-)

Daher nochmal ganz einfach die Frage: Kann man in CAKE beim Speichern eines NEUEN Datensatzes den Wert für den PrimaryKey (id) SELBST beim Speichern setzen?

Das Model nutzt das Tree-Behaviour und hat auch noch "verknüpfte" andere Models, d.h. dieser Key muss dann natürlich beim saveAll an die anderen Models weitergegeben werden.

Vielen Dank und Grüße
Marcus
artoros
 
Beiträge: 2
Registriert: Do 26. Nov 2009, 16:28

Re: Primary Key selbst vergeben

Beitragvon mbrod » Do 26. Nov 2009, 17:24

Ok, das war jetzt wahrscheinlich alles viel zu kompliziert erklärt.

Nee, sogar ich habe das verstanden. Aber um das Problem zu präzisieren: Geht es dabei ausschließlich um neue Datensätze, was SQL-mäßig INSERTs bedeuten würde, oder auch um Aktualisierung von bestehenden Datensäzen, was zu UPDATEs führen würde?
mbrod
 
Beiträge: 199
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: Primary Key selbst vergeben

Beitragvon euromark » Fr 27. Nov 2009, 00:43

bui UUIDs ist das meistens ok
aber bei AIIDs (auto increment) würd ich aufpassen
da sollte man normal NIE den primärschlüssel anfassen
aber ja, das geht theoretisch

einfach die primary id mit angeben
dann wird diese abgespeichert statt eine neue zu generieren

der grund, warum das bei UUIDs noch akzeptabel ist
(import, etc), ist dass diese eben theoretisch 100% einzigartig sind - und
es damit zu keinen kollisionen kommen kann.

interessant in dem aspekt - so am rande - ist die arbeit mit HasOne
da kann man sich nämlich die fremdschlüssel sparen und direkt die UUIDS "id" aus beien spalten
verknüpfen - super sache! und da ist dann auch standard, dass man die jeweilige abgeleitete tabelle
mit "manuellen" primary keys füllt - nämlich die von der Haupt-Tabelle.
euromark
 
Beiträge: 643
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.x
OS: Windows

Re: Primary Key selbst vergeben

Beitragvon artoros » Fr 27. Nov 2009, 08:36

Hi! Danke schon mal für die Antworten!

mbrod hat geschrieben:Geht es dabei ausschließlich um neue Datensätze, was SQL-mäßig INSERTs bedeuten würde, oder auch um Aktualisierung von bestehenden Datensäzen, was zu UPDATEs führen würde?


Nur um Inserts. Es geht ja um einen "Erst-Import".

euromark hat geschrieben:einfach die primary id mit angeben
dann wird diese abgespeichert statt eine neue zu generieren


Bist Du Dir sicher? Weil genau das hab ich - in verschiedensten Variationen versucht:

Code: Alles auswählen
$this->Category->id = 123;
$this->Category->saveAll($data);


wobei

Code: Alles auswählen
$data['Category']['id'] = 123;


Und jedes Mal taucht die id-Spalte im von Cake erzeugten SQL-Statement nicht auf. Selbst wenn ich die "id"-Spalte im "fields"-Array mit angebe: nix.
Ich hab auch schon die "autoincrement"-Eigenschaft in der mySQL-Spalte weggelassen. Dann knallt's weil 2 Datensätze die id=0 haben (da Cake die id Spalte eben leider nicht füllt)

Es können keine UUIDs sein, da der Ersteller der Import-Datei ja die IDs selbst vergeben will.

Was tun?

Kannst Du mir ein Beispiel kurz skizzieren, wie Du meinst, dass es gehen sollte? Vielleicht habe ich da gerade echt nen Brett vorm Kopf. :roll:
artoros
 
Beiträge: 2
Registriert: Do 26. Nov 2009, 16:28

Re: Primary Key selbst vergeben

Beitragvon euromark » Fr 27. Nov 2009, 15:18

ich bin mir 100% sicher, dass es im HAS ONE Fall geht
denn da verwende ich es bei "users hasOne "user_infos"

und im user_info model:
Code: Alles auswählen

$userInfo = // find
...
$data = $this->data; // etc
        if (!empty($userInfo)) {

// record exists, normal update
            $this->id = $uid;
            if (isset($data['UserInfo']['id'])) { unset($data['UserInfo']['id']); }
        } else {
// record does not exist, create record with manual id (=uid from users table)
            $this->create();
            $data['UserInfo']['id'] = $uid;
        }
        return $this->save($data, $validate, $fieldList);

dazu sei angemerkt, dass es UUIDs sind
bei normalen AIIDs könnte cake sich evtl anders verhalten

aber theoretisch könntest du doch den importer so bauen, dass UUIDs genommen werden
versteh da dein problem nich, warum du AIIDs brauchst

immerhin sollte es nicht sein, dass du in der DB neue felder 3,4,5 per webformualr hinzufügst um dann noch ein csv-import auf 4,5,6 zu machen
das ganze umgehst du ja mit UUIDs, weil keine 2x vorkommen kann - egal ob du auf der live db weitere records hinzufügst
euromark
 
Beiträge: 643
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.x
OS: Windows


Zurück zu Models

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 1 Gast