mysqlstruktur verbessern

lordlamer

lordlamer

Haudegen
hi!

ich hab ne mysqldb struktur für mysql3. diese möchte ich nun auf mysql4 optimieren. das heisst eigentlich möchte ich referentielle intigrität mit einfügen. hab das schonmal probiert aber es hat leider net bei mir funktioniert. vielleicht kann mir ja jemand helfen. hier erstmal meine struktur:

PHP:
CREATE TABLE `content` (
  `id` int(11) NOT NULL auto_increment,
  `belongs_to` int(11) NOT NULL default '0',
  `content` text NOT NULL,
  PRIMARY KEY  (`id`)
);

CREATE TABLE `files` (
  `id` int(11) NOT NULL auto_increment,
  `belongs_to` int(11) default NULL,
  `file` blob,
  `filename` varchar(255) default NULL,
  `filesize` int(11) default NULL,
  `filetype` varchar(255) default 'application/octet-stream',
  PRIMARY KEY  (`id`)
);

CREATE TABLE `tree` (
  `id` int(11) NOT NULL auto_increment,
  `belongs_to` int(11) NOT NULL default '0',
  `title` varchar(255) NOT NULL default '',
  `visible` int(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
);

bei diesem dump handelt sich um eine baumstruktur die inhalte enthalten kann. und an den inhalten hängen vielleicht dateien.

das heisst in der tabelle files enthält die spalte belongs_to die id aus der tabelle content. und die spalte belongs_to in der tabelle content enthält die id aus der tabelle tree. und in tree enthält die spalte belongs_to die id aus der selben tabelle.

vielen dank schonmal

mfg frank
 
Foreign Key

Das Stichwort lautet: foreign key
Code:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name, ...)
    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
ALSO:
Code:
alter table tree
add foreign key FK_TREE_TREE  belongs_to references tree.id
on delete restrict
on update set null;

alter table content
add foreign key FK_CONTENT_TREE  belongs_to references tree.id
on delete restrict
on update restrict;

alter table files
add foreign key FK_FILES_CONTENT  belongs_to references content.id
on delete restrict
on update restrict;

on XXX cascade heißt: Gibt es den Wert nicht, so wird er eingetragen.
on XXX restrict heißt: Insert klappt nur, wenn der Wert vorhanden ist.

Beim Tree hat man halt das Problem, dass das Root-Element keinen Vorgänger hat.
Da musste kucken was besser passt. Aber ich denke mit "SET NULL" biste gut bedient.

Die anderen Werte dürften ja selbsterklärend sein.

Ich hoffe ich konnte helfen.
Hier findest du alles http://dev.mysql.com/doc/mysql/de
 
hi!

danke erstmal!

hab aber noch paar fragen bzw verständnisprobleme.

läuft das mit mysql 4.0.x ?

bei mir kann ich deine sqlstatements nicht 1 zu 1 übernehmen. bekomme folgenden fehler:
Code:
You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'belongs_to REFERENCES tree.id ON  DELETE  RESTRICT  ON  UPDATE

so und dann noch mein verständnisproblem. undzwar versteh ich den teil mit "foreign key FK_CONTENT_TREE belongs_to" nicht. also das FK_CONTENT_TREE zb. hab da die mysqldoku auch noch net so ganz verstanden.

mfg frank
 
Erklärungsversuch

"foreign key FK_CONTENT_TREE belongs_to"
Ist halt einfach so. Das ist eben die Syntax.

Du veränderst eine Tabelle und hängst an eine (oder mehrere Spalten) einen Fremdschlüssel welcher widerrum auf eine (oder mehrere Spalten) einer Tabelle zeigt.
Dann legst du noch fest wie dieser Fremdschlüssel bei Nichtvorhandensein des Wertes auf den er verweißt handeln soll.
Soll er "restrict" sein und sich brutal weigern?
Soll er "cascade" sein und einfach den fehlenden Schlüssel eintragen.

Also
Code:
[color=green]alter table tree[/color]
[color=red]# hier gibt's noch keine Probleme[/color]
[color=green]add foreign key FK_TREE_TREE[/color]
[color=red]# erstelle einen Fremdschlüssel mit Namen "FK_TREE_TREE"[/color]
[color=green]belongs_to[/color]
[color=red]# von welcher Spalte aus [/color]
[color=green]references tree.id[/color]
[color=red]# auf welche zeigt der Fremdschlüssel [/color]
[color=green]on update restrict on delete restrict[/color]
[color=red]# wie verhält er sich[/color]


Aber "cascade" löscht auch den Schlüssel wenn der Eintrag gelöscht wird.
Darum würde ich "on delete cascade" nur wohlüberlegt einsetzen.
 

Ähnliche Themen

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

Akonadi startet nicht mehr

Mit bash mysql in Schleife abfragen

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

CSV Datei mit sed manipulieren/optimieren/ergänzen

Zurück
Oben