CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
14.04.2010, 00:26:50
|
Anfänger
|
|
Registriert seit: Apr 2010
Alter: 36
Beiträge: 5
|
|
Problem: selbst referenzieren
Hallo,
angenommen ich habe eine Tabelle Container in der sich 2 Spalten befinden:
- container_id INT PRIMARY KEY auto_increment
- kind_von INT referenziert container_id
Mein Ziel ist, dass ich eine Tabelle habe, mit der ich die Container beliebig schachteln kann. Die Container sollen später mal dazu dienen gewisse Module zu gruppieren.
Ich habe jetzt folgendes Problem:
Wenn ich einen neuen Container anlege, kommt es zu einem Fehler, da ich kind_von angeben muss, die container_id allerdings noch nicht bekannt ist.
Das ganze funktioniert natürlich, wenn bereits ein Container angelegt wurde.
Allerdings wenn es der Erste ist, fehlt mir die Information der container_id, die ja erst per auto_increment vergeben wird.
Wie kann man da vorgehen? Bin hier noch nen Frischling was das angeht. Vielleicht gibts ja auch nen anderen Ansatz?!
Danke im Voraus
|
14.04.2010, 04:51:25
|
|
Senior Member
|
|
Registriert seit: Feb 2006
Ort: Wallrabenstein
Alter: 55
Beiträge: 1.044
|
|
AW: Problem selbst Referenzieren
Du kannst einen default Wert festlegen. Da später auto_increment Werte in diese Spalte gehören würde sich die 0 (nicht NULL) anbieten.
|
14.04.2010, 07:56:50
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: Problem: selbst referenzieren
Hi
Zitat:
Zitat von zorkez
Mein Ziel ist, dass ich eine Tabelle habe, mit der ich die Container beliebig schachteln kann. Die Container sollen später mal dazu dienen gewisse Module zu gruppieren.
|
Könntest du dazu mal 3-? Test datensätze zeigen. Auch wenn du es
gut erklärt hast, habe ich es nicht so ganz verstanden glaub ich ;)
container_id | kind_von
1| 1
2| 1
3| 2
etwa so?
mfg
Ckaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
|
14.04.2010, 09:53:52
|
Anfänger
|
|
Registriert seit: Apr 2010
Alter: 36
Beiträge: 5
|
|
AW: Problem selbst Referenzieren
Ja, die Einträge stimmen so.
So soll es letzten Endes einmal aussehen.
Es gibt nur ein Problem beim Anlegen des Datensatzes:
4 | 4
Der Datensatz müsste sich ja selbst referenzieren, da er in diesem Fall kein Kind von einem anderen Container werden soll.
Ein Default-Wert bedeutet ja, dass der Container ein Kind von irgendeinem anderen Container ist (z.B. 1).
Der Default-Wert 0 ist ja nicht erlaubt, da keine container_id 0 verfügbar ist.
Ich dachte das es soetwas wie nextVal gibt, der den Wert der nächsten container_id einträgt.
Alternativ könnte ich das natürlich auch in 2 Schritten lösen. Erst anlegen und dann abändern. D.h. aber auch, dass ich das für alle Softwarelösungen so implementieren muss. Das will ich eigentlich vermeiden.
Wie gesagt. Vielleicht ist ja auch mein Vorgehen falsch. Bin für Hinweise dankbar.
|
14.04.2010, 10:12:52
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: Problem selbst Referenzieren
Hi
Zitat:
Der Default-Wert 0 ist ja nicht erlaubt, da keine container_id 0 verfügbar ist.
|
Was ja bei anlegen der DB kein problem wäre einen container 0 an zu legen. Üblich bei
Nun mir erschliesst sich halt auch nicht der Sinn deiner Referenzierung.
Zitat:
Die Container sollen später mal dazu dienen gewisse Module zu gruppieren
|
Deswegen kann ich dir leider auch nicht einen anderen weg anbieten.
Vielleicht erklärst du grob was du damit erreichen willst.
Zitat:
Erst anlegen und dann abändern. D.h. aber auch, dass ich das für alle Softwarelösungen so implementieren muss. Das will ich eigentlich vermeiden.
|
Mit einer funktion sollte das aber kein problem sein.
mfg
Ckaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
|
14.04.2010, 11:06:52
|
Anfänger
|
|
Registriert seit: Apr 2010
Alter: 36
Beiträge: 5
|
|
AW: Problem selbst Referenzieren
Hi, danke für die Antworten.
Also ich will z.B. meinen Kollegen eine Seite selbst erstellen lassen. Module dafür sind schon vorhanden.
Aus designtechnischen Gründen will ich Container einsetzen, um Module zu gruppieren, weil dieses Vorgehen die Positionierung erleichtert.
Also so sieht die DB zwar nicht aus, aber grob beschrieben so:
uri varchar(255)
container_id int primary key...
kind_von int
Ein Container wird also einer bestimmten Seite zugewiesen.
Lege ich jetzt wie eben schon beschrieben einen Container mit dem Wert 0 an (sozusagen als "root" oder "Startknoten") und geben bei dem neuen Eintrag in child_of = 0 an, dann ist ja dieser angelegte Container ein Kind von 0 mit der uri "xxx".
Jeder Container muss einer uri zugewiesen werden.
Mir fällt gerade ein, dass ich auch die uri auf "" (also leer) setzen kann... aber sauber ist das dann auch nicht...
Ich denke mal darauf rum.
Eine Funktion um das Problem zu lösen kommt hier nicht in Frage, da dass den schlechten Datenbankstil noch unterstreicht.
Edit:
Das mit dem leeren uri-Feld wird nicht funktionieren, da es sich hier auch um einen Fremdschlüssel handelt.
Geändert von zorkez (14.04.2010 um 11:23:18 Uhr)
|
14.04.2010, 14:09:22
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: Problem selbst Referenzieren
Hi
Zitat:
Module dafür sind schon vorhanden.
Aus designtechnischen Gründen will ich Container einsetzen, um Module zu gruppieren, weil dieses Vorgehen die Positionierung erleichtert.
|
Erstmal gut...macht joomla ja auch so ;)
Nur warum musst du um Module (was auch immer du darunter verstehst
oder meinst) per Fremdschlüssel gruppieren?
Ich denke ohne weitreichende Infos um deinen geplanten Aufbau kann
dir hier keiner helfen das zu verbessern.
Aber zu deiner eingangsfrage soweit ich weis ist eine Referenz nur
auf eine andere Tabelle sinnvoll und gestattet.
Les dich hier weiter schlau ;)
mfg
Ckaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
|
14.04.2010, 19:02:06
|
Anfänger
|
|
Registriert seit: Apr 2010
Alter: 36
Beiträge: 5
|
|
AW: Problem selbst Referenzieren
Gutgut. Ich werde mich mal in Joomla einlesen und das ggf. so einbauen.
Zitat:
Aber zu deiner eingangsfrage soweit ich weis ist eine Referenz nur
auf eine andere Tabelle sinnvoll und gestattet.
|
Also ich hab das Konzept mit MySQL Workbench gemacht. Wenn das nicht erlaubt wäre, wäre es glaube ich nicht im Programm möglich.
Ich melde mich nochmal wenn ich was gefunden habe...
|
14.04.2010, 22:33:56
|
Anfänger
|
|
Registriert seit: Apr 2010
Alter: 36
Beiträge: 5
|
|
Also eine nextval Funktion wie in Oracle scheint es in MySQL nicht zu geben.
Die Lösungen eine Navigation in einer Baumstruktur in der DB zu realisieren ist meinem Vorhaben ja sehr ähnlich.
Dort arbeiten die Leute in diesem Forum auch mit parent- oder child - Feldern.
Allerdings setzen die Leute keine Referenz.
Dieses Vorgehen gefährdet aber die Integrität.
D.h. doch, dass wenn ich den Primary Key ändere, müsste ich alle Kind-Einträge auch ändern... sehr unschön.
Scheint also in MySQL nur die Möglichkeit zu geben: Erst einfügen und dann ändern....
Oder?
Edit:
Das Problem dürfte mehr oder weniger über last_insert_id() zu realisieren sein. Damit ist das geklärt.
Bis dann
Geändert von zorkez (14.04.2010 um 22:49:58 Uhr)
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 00:36:07 Uhr.
|