php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 13.01.2011, 14:18  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard [Erledigt] InnoDB Constraints

Hallo,

ich habe ein Problem bei der Erstellung einer Tabellenstruktur. Folgender Query:

Code:
-- -----------------------------------------------------
-- Table `auser_db_test`.`usergroups`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `auser_db_test`.`usergroups` (
  `userID` INT UNSIGNED NOT NULL ,
  `groupID` INT UNSIGNED NOT NULL ,
  PRIMARY KEY (`userID`, `groupID`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `auser_db_test`.`users`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `auser_db_test`.`users` (
  `userID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `parentID` INT UNSIGNED NOT NULL ,
  `login` VARCHAR(200) NOT NULL ,
  `passwd` VARCHAR(200) NOT NULL ,
  `admin` TINYINT(1)  NOT NULL DEFAULT 0 ,
  `backend` TINYINT(1)  NOT NULL DEFAULT 0 ,
  `disabled` TINYINT(1)  NOT NULL DEFAULT 0 ,
  `permsreload` TINYINT(1)  NOT NULL DEFAULT 1 ,
  PRIMARY KEY (`userID`) ,
  UNIQUE INDEX `login_UNIQUE` (`login` ASC) ,
  INDEX `usergroups.userID` (`userID` ASC) ,
  INDEX `users.parentID` (`parentID` ASC) ,
  CONSTRAINT `usergroups.userID`
    FOREIGN KEY (`userID` )
    REFERENCES `auser_db_test`.`usergroups` (`userID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `users.parentID`
    FOREIGN KEY (`parentID` )
    REFERENCES `auser_db_test`.`users` (`userID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;


-- -----------------------------------------------------
-- Table `auser_db_test`.`groups`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `auser_db_test`.`groups` (
  `groupID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `parentID` INT UNSIGNED NULL ,
  `name` VARCHAR(200) NOT NULL ,
  PRIMARY KEY (`groupID`) ,
  INDEX `groups.parentID` (`parentID` ASC) ,
  INDEX `usergroups.groupID` (`groupID` ASC) ,
  CONSTRAINT `groups.parentID`
    FOREIGN KEY (`parentID` )
    REFERENCES `auser_db_test`.`groups` (`groupID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `usergroups.groupID`
    FOREIGN KEY (`groupID` )
    REFERENCES `auser_db_test`.`usergroups` (`groupID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
Fehler dazu:
Error Code 1005, Can't create table ./auser_db_test/groups.frm (errno: 150)

An irgendwelchen Bezeichnern liegt es nicht, wenn ich den fett-markierten Constraint entferne, gehts einwandfrei.

Weiß jemand woran's hängen könnte?
Andreas ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 13.01.2011, 14:26  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

http://dev.mysql.com/doc/refman/5.5/...ror-codes.html

Zitat:
1005 (ER_CANT_CREATE_TABLE)
Cannot create table. If the error message refers to error 150, table creation failed because a foreign key constraint was not correctly formed.
__________________
Warum denkt mein Hund eigentlich immer dann, wenn es an der Tür klingelt, es sei für ihn?
Wolla ist offline   Mit Zitat antworten
Alt 13.01.2011, 14:42  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Wenn du einen Foreign Key anlegen willst muss das immer auf einen Primary key gehen. Und entweder auf den ganzen oder auf "vordere" Teile vom Primary Key.

Wenn du also den primary key aus den Spalten A, B, C hast dann kannst du nen Foreign Key nur auf:
A,B,C
A,B
A
legen.

Bei dir kannst du also auf groupID nur dann einen Foreign Key legen wenn du noch einen extra Index auf groupID legst.

Im übrigen Funktionieren Indize auch so. Wenn du z.b. nach etwas suchst dann geht das immer nur auf dem Index (ob normaler oder Primary ist egal) wenn du alle Spalten oder einen Teil der vorderen nimmst. Im Beispiel oben würde ein Index benutzt wenn du nach
A,B,C
A,B
A
suchst, nur nach B oder B,C wäre ineffizient weil der Primary Key/Index nicht genutzt würde, daher müsste man dann einen eigenen Index dafür anlegen.
Flor1an ist offline   Mit Zitat antworten
Alt 13.01.2011, 15:21  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Bei dir kannst du also auf groupID nur dann einen Foreign Key legen wenn du noch einen extra Index auf groupID legst.
Was meinst du mit "extra Index"? Also ich hab deine Aussage jetzt so verstanden, dass man bei Verwendung eines zusammengesetzten Primärschlüssels auf die gewünschte Foreign-Key-Tabelle einen zweiten Index der gleichen Spalte nur mit anderem Namen definieren muss. Quasi so:

Code:
CREATE  TABLE IF NOT EXISTS `auser_db_test`.`groups` (
  `groupID` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `parentID` INT UNSIGNED NULL ,
  `name` VARCHAR(200) NOT NULL ,
  PRIMARY KEY (`groupID`) ,
  INDEX `groups.parentID` (`parentID` ASC) ,
  INDEX `usergroups.userID` (`groupID` ASC) ,
  INDEX `usergroups.groupID` (`groupID` ASC) ,
  CONSTRAINT `groups.parentID`
    FOREIGN KEY (`parentID` )
    REFERENCES `auser_db_test`.`groups` (`groupID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `usergroups.groupID`
    FOREIGN KEY (`groupID` )
    REFERENCES `auser_db_test`.`usergroups` (`groupID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
Aber da das auch nicht geht, nehme ich an, ich hab dich falsch verstanden?!
Andreas ist offline   Mit Zitat antworten
Alt 13.01.2011, 15:26  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Nein anders rum. Auf der Tabelle auf die sich der Foreign key beziehen soll! In deinem Fall hat usergroups einen PrimaryKey (userid, groupid). Du kannst jetzt in anderen Tabellen FKs definieren die auf "userid, groupid" oder "userid" zeigen. Du kannst aber keine FKs anlegen die nur auf groupid gehen. Daher müsstest du in der usergroups Tabelle noch einen Index auf groupid legen. Ich denke dann müsste das gehen.
Flor1an ist offline   Mit Zitat antworten
Alt 13.01.2011, 16:16  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Klasse, hat funktioniert. Danke.
Andreas ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
innodb/myisam ENIGNE INNODB & phpmyadmin taurus Datenbanken 8 30.11.2010 13:49
[Erledigt] MyISAM vs InnoDB bitsnack Datenbanken 17 03.11.2010 10:13
[Erledigt] innodb / myisam - Speicherort Tabellen taurus Datenbanken 3 27.04.2010 13:12
performante Verknüpfung von Tabellen?? Gimpel Datenbanken 13 27.02.2010 14:57
MySQL startet erst nach einer Stunde schumiel Server, Hosting und Workstations 7 26.01.2010 12:23
InnoDB Fehler - Was kann man tun? Moviereporter Datenbanken 3 03.12.2009 12:59
[Erledigt] Nur Wörter rund um ein gesuchtes Wort zeigen djscaleo PHP Tipps 2009 26 13.04.2009 12:57
Einstellungen InnoDB PsychoEagle Datenbanken 3 13.08.2008 16:27
Tipp zur Volltextsuche? InnoDB zu MyISAM? bicpi Datenbanken 0 21.09.2006 17:43
MySQL startet nicht mehr: InnoDB Hendrik007 Datenbanken 7 05.07.2006 11:21
Volltextsuche mit InnoDB guenterfrosch Datenbanken 2 04.06.2006 14:41
phpMyAdmin startet nicht Datenbanken 12 02.02.2006 12:07
Beziehungen mit InnoDB??? T.Peters PHP Tipps 2006 1 25.01.2006 18:29
[Erledigt] MySQL findet Datenbank nicht Datenbanken 10 21.10.2004 09:14

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
zusammengesetzter schlüssel als fremdschlüssel phpmyadmin, innodb constraints, php innodb, innodb fremdschlüssel, http://www.php.de/datenbanken/76074-erledigt-innodb-constraints.html, 1005 (er_cant_create_table) was ist falsch?, innodb constraints problems, constraint no action, can\'t create table (errno: 150), innodb delete contraint from table, \on delete no action on update no action\ constraint, \int unsigned null\, php constraints, innodb onupdate, engine=innodb t-online, constraints innodb unsigned int, innodb ondelete, innodb update primary keys, innodb null constraints, can\'t create table innodb default charset=utf8;

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:18 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum