Fremdschlüßel: Es kann doch nicht so schwierig sein!

MySQL, PostgreSQL, SQLite
deever
Posts: 18
Joined: 2004-11-21 15:05

Fremdschlüßel: Es kann doch nicht so schwierig sein!

Post by deever » 2004-12-26 00:08

Hey Amigos, wie geht's?

Da ich Benutzeraccounts per MySQL verwalten will, habe ich folgendes Skript erstellt, das natürlich noch erweitert werden soll:

Code: Select all

DROP DATABASE IF EXISTS system;
CREATE DATABASE system;
USE system;

CREATE TABLE groups (
  ID int(11) unsigned NOT NULL auto_increment,
  name varchar(16) NOT NULL default 'nogroup',
  hostname varchar(64) NOT NULL default 'localhost',
  gid smallint(6) unsigned NOT NULL default '65535',
  comment varchar(128) NOT NULL default 'Default group',
  PRIMARY KEY (`ID`)
) TYPE=InnoDB;

CREATE TABLE users (
  ID int(11) unsigned NOT NULL auto_increment,
  login varchar(16) NOT NULL default 'nobody',
  hostname varchar(64) NOT NULL default 'localhost',
  uid smallint(5) unsigned NOT NULL default '65535',
  gid smallint(5) unsigned NOT NULL default '65535',
  passwd varchar(40) NOT NULL default '*',
  home varchar(64) default '/dev/null',
  realname varchar(64) default 'Dwight Default',
  comment varchar(128) default 'Default Luser',
  FOREIGN KEY (`gid`) REFERENCES groups (`gid`) ON DELETE CASCADE ON UPDATE CASCADE,
  PRIMARY KEY (`ID`)
) TYPE=InnoDB;
Ohne den foreign key erstellt er die beiden Tabellen, aber wenn ich das Skript wie gepostet ausführe, meckert er:

Code: Select all

ERROR 1005 at line 14: Can't create table './system/users.frm' (errno: 150)

Code: Select all

$ perro 150
MySQL error:  150 = Foreign key constraint is incorrectly formed
Das kann aber nicht sein, da ich es sogar mal mit nem INDEX in der users-Tabelle probiert habe.
An der Installation hab ich eigentlich nichts rumgefummelt, have_innodb ist "YES" und InnoDB meldet auch keine Fehler! Was haut da nicht? :(

Vielen Dank für eure Antworten!
Gruß,
/dev

jhnet
Posts: 98
Joined: 2004-07-20 11:43

Re: Fremdschlüßel: Es kann doch nicht so schwierig sein!

Post by jhnet » 2004-12-27 17:21

Hallo,

Nein, ist auch nicht schwer :)
Ein Fremdschlüssel in einer Relation muss in der zweiten Relation als Primärschlüssel definiert sein. Dein Fremdschlüssel verweist auf groups(gid), der Primärschlüssel wäre aber groups(ID).
Oder Du definierst in der Relation groups gid als Primärschlüssel.

Bye,
Jörg

deever
Posts: 18
Joined: 2004-11-21 15:05

Re: Fremdschlüßel: Es kann doch nicht so schwierig sein!

Post by deever » 2004-12-28 11:24

Ok ich hab jetzt mal das Skript dahingehend abgeändert, aber das funktioniert immer noch nicht!:

Code: Select all

DROP DATABASE IF EXISTS system;
CREATE DATABASE system;
USE system;

CREATE TABLE groups (
  ID int(11) unsigned NOT NULL auto_increment,
  name varchar(16) NOT NULL default 'nogroup',
  hostname varchar(64) NOT NULL default 'localhost',
  gid smallint(6) unsigned NOT NULL default '65535',
  comment varchar(128) NOT NULL default 'Default group',
  PRIMARY KEY (`ID`,`hostname`,`gid`)
) TYPE=InnoDB;

CREATE TABLE users (
  ID int(11) unsigned NOT NULL auto_increment,
  login varchar(16) NOT NULL default 'nobody',
  hostname varchar(64) NOT NULL default 'localhost',
  uid smallint(5) unsigned NOT NULL default '65535',
  gid smallint(5) unsigned NOT NULL default '65535',
  passwd varchar(40) NOT NULL default '*',
  home varchar(64) default '/dev/null',
  realname varchar(64) default 'Dwight Default',
  comment varchar(128) default 'Default Luser',
  FOREIGN KEY (`gid`) REFERENCES groups (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
  PRIMARY KEY (`ID`,`hostname`,`uid`)
) TYPE=InnoDB;
Der bringt immer noch den gleichen Fehler, obwohl groups.ID jetzt definitiv im Primärschlüßel ist.

jhnet
Posts: 98
Joined: 2004-07-20 11:43

Re: Fremdschlüßel: Es kann doch nicht so schwierig sein!

Post by jhnet » 2004-12-28 11:38

Hi,

bin mir nicht ganz sicher, aber meiner Meinung nach hast Du jetzt einen Primärschlüssel aus drei Feldern erzeugt. Versuchs mal wenn der Primärschlüssel in groups nur aus ID besteht.
So nebenbei bemerkt: Für eine Nutzerverwaltung sind die Relationen eher ungeeignet, wie bildest Du z.B. Nutzer ab, die Mitglied in mehreren Gruppen sind?

Bye,
Jörg

deever
Posts: 18
Joined: 2004-11-21 15:05

Re: Fremdschlüßel: Es kann doch nicht so schwierig sein!

Post by deever » 2004-12-28 14:34

JHnet wrote:bin mir nicht ganz sicher, aber meiner Meinung nach hast Du jetzt einen Primärschlüssel aus drei Feldern erzeugt.
Korrekt!
Versuchs mal wenn der Primärschlüssel in groups nur aus ID besteht.
Das geht trotzdem nicht. Es kommt immer noch der gleiche Fehler! Mein jetztiges Skript sieht so aus:

Code: Select all

DROP DATABASE IF EXISTS system;
CREATE DATABASE system;
USE system;

CREATE TABLE groups (
  ID int(11) unsigned NOT NULL auto_increment,
  name varchar(16) NOT NULL default 'nogroup',
  hostname varchar(64) NOT NULL default 'localhost',
  gid smallint(6) unsigned NOT NULL default '65535',
  comment varchar(128) NOT NULL default 'Default group',
  PRIMARY KEY (`ID`)
) TYPE=InnoDB;

CREATE TABLE users (
  ID int(11) unsigned NOT NULL auto_increment,
  login varchar(16) NOT NULL default 'nobody',
  hostname varchar(64) NOT NULL default 'localhost',
  uid smallint(5) unsigned NOT NULL default '65535',
  groupID int(11) unsigned NOT NULL,
  passwd varchar(40) NOT NULL default '*',
  home varchar(64) default '/dev/null',
  realname varchar(64) default 'Dwight Default',
  comment varchar(128) default 'Default Luser',
  FOREIGN KEY (`groupID`) REFERENCES groups (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
  PRIMARY KEY (`ID`)
) TYPE=InnoDB;
So nebenbei bemerkt: Für eine Nutzerverwaltung sind die Relationen eher ungeeignet, wie bildest Du z.B. Nutzer ab, die Mitglied in mehreren Gruppen sind?
Das kommt noch. Für die n-n Beziehungen brauche ich natürlich noch eine extra Tabelle. Die Gruppen-ID im Benutzerdatensatz stellt nur die Initial Group dar.

Danke für deine Hilfe! ;)
Gruß,
/dev

deever
Posts: 18
Joined: 2004-11-21 15:05

Re: Fremdschlüßel: Es kann doch nicht so schwierig sein!

Post by deever » 2005-01-01 03:43

Vermutung: Eine Tabelle kann nicht gleichzeitig einen Fremdschlüßel und einen Primärschlüßel enthalten? Ist ja irgendwie auch logisch! Und Fremdschlüßel lassen sich nicht hierarchisch ordnen...

Ist das richtig?
Gruß,
/dev

deever
Posts: 18
Joined: 2004-11-21 15:05

Re: Fremdschlüßel: Es kann doch nicht so schwierig sein!

Post by deever » 2005-01-01 21:51

Nein, das (allein) kanns auch nicht sein! :( Ich hab das Skript jetzt so verändert/erweitert:

Code: Select all

DROP DATABASE IF EXISTS system;
CREATE DATABASE system;
USE system;

CREATE TABLE users (
  UserID int(11) unsigned NOT NULL auto_increment,
  GroupID int(11) unsigned NOT NULL,
  login varchar(16) NOT NULL default 'nobody',
  hostname varchar(64) NOT NULL default 'localhost',
  uid smallint(5) unsigned NOT NULL default '65535',
  passwd varchar(40) NOT NULL default '*',
  home varchar(64) default '/dev/null',
  realname varchar(64) default 'Dwight Default',
  comment varchar(128) default 'Default Luser',
  PRIMARY KEY (`UserID`)
) TYPE=InnoDB;

CREATE TABLE groups (
  GroupID int(11) unsigned NOT NULL auto_increment,
  name varchar(16) NOT NULL default 'nogroup',
  hostname varchar(64) NOT NULL default 'localhost',
  gid smallint(6) unsigned NOT NULL default '65535',
  comment varchar(128) default 'Default group',
  PRIMARY KEY (`GroupID`)
) TYPE=InnoDB;

CREATE TABLE mail (
  UserID int(11) unsigned NOT NULL default '0',
  home varchar(64) default '/dev/null',
  FOREIGN KEY (`UserID`) REFERENCES `users` (`UserID`) ON DELETE CASCADE ON UPDATE CASCADE
) TYPE=InnoDB;
Das bringt immer noch den gleichen Fehler, natürlich bei der Zeile "CREATE TABLE mail (".

Kann mir jemand helfen? Ich werd langsam verrückt! :(
Gruß,
/dev

jhnet
Posts: 98
Joined: 2004-07-20 11:43

Re: Fremdschlüßel: Es kann doch nicht so schwierig sein!

Post by jhnet » 2005-01-04 00:31

Hallo,

nur so ein Gedanke: Mach mal aus der Spalte UsersID in mail noch einen Index, zumindest im Mysql-Manual ist das so angegeben.

Bye,
Jörg

deever
Posts: 18
Joined: 2004-11-21 15:05

Re: Fremdschlüßel: Es kann doch nicht so schwierig sein!

Post by deever » 2005-01-04 10:09

Jaaa, das funktioniert! :)
Ich hab das schon mal mit Indexes probiert, aber damals hats halt wegen dem andern Problem nicht funktioniert! Im MySQL-Buch ist es aber auch ohne Indizes angegeben! Für was braucht MySQL in diesem Zusammenhang denn überhaupt einen Index?

Dank dir vielmals! Endlich kann ich ernsthaft mit dem Aufsetzen der Servers beginnen!
Gruß,
/dev