php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 07.11.2011, 13:26  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard [Erledigt] Constraint-Fehler, Tabellen können nicht angelegt werden

Ich möchte gerne eine Tabellenstruktur erstellen, in der Bestellungen (order) mit einem Status (orderstatus) gespeichert und einem Benutzer (user) zugeordnet werden können.

Folgendes Statement habe ich mir mit dem MySQL-Workbench zusammengeklickt.

Code:
-- -----------------------------------------------------
-- Table `datenbank`.`order`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `datenbank`.`order` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `user_id` INT NULL ,
  `orderstatus_id` INT NOT NULL ,
  `cartid` VARCHAR(200) NULL ,
  `orderidenthash` VARCHAR(200) NULL ,
  `asin` VARCHAR(200) NOT NULL ,
  `title` VARCHAR(200) NULL ,
  `quantity` INT NOT NULL ,
  `itemprice` DECIMAL(9,2) NOT NULL ,
  `sumprice` DECIMAL(9,2) NOT NULL ,
  `earnings` DECIMAL(9,2) NOT NULL DEFAULT 0.00 ,
  `payback` DECIMAL(9,2) NOT NULL DEFAULT 0.00 ,
  `comment` VARCHAR(200) NULL ,
  `updated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
  `created` TIMESTAMP NULL ,
  `disabled` TINYINT(1)  NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_order_user1` (`user_id` ASC) ,
  INDEX `fk_order_orderstatus1` (`orderstatus_id` ASC) ,
  CONSTRAINT `fk_order_user1`
    FOREIGN KEY (`user_id` )
    REFERENCES `datenbank`.`user` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_order_orderstatus1`
    FOREIGN KEY (`orderstatus_id` )
    REFERENCES `datenbank`.`orderstatus` (`id` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `datenbank`.`user`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `datenbank`.`user` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `login` VARCHAR(200) NOT NULL ,
  `email` VARCHAR(200) NOT NULL ,
  `firstname` VARCHAR(200) NULL ,
  `lastname` VARCHAR(200) NULL ,
  `passwdhash` VARCHAR(200) NOT NULL ,
  `hashalgo` VARCHAR(200) NOT NULL ,
  `hashrounds` INT NOT NULL DEFAULT 50 ,
  `tempkey` VARCHAR(200) NULL ,
  `updated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
  `created` TIMESTAMP NULL ,
  `disabled` TINYINT(1)  NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `email_UNIQUE` (`email` ASC) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `datenbank`.`orderstatus`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `datenbank`.`orderstatus` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(200) NULL ,
  `updated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
  `created` TIMESTAMP NULL ,
  `disabled` TINYINT(1)  NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;
Allerdings gibt es ein Problem mit dem (oben rot markierten) Teil:

Code:
ON DELETE SET NULL

Damit wollte ich erreichen, dass wenn jetzt ein Eintrag aus "orderstatus" gelöscht wird, nicht automatisch alle zugehörigen Einträge aus "order" gelöscht werden, sondern einfach die "orderstatus_id" auf NULL gesetzt wird. Mir ist die Art von Beziehung hier nicht ganz klar...

ON UPDATE und ON DELETE beziehen sich ja offensichtlich auf die Tabelle "order". Aber worauf bezieht sich nun das SET? Bezieht sich das auf die andere Tabelle?

Oder müsste man die FK's in die andere Richtung definieren? Also quasi auf "orderstatus" ein FK nach order mit ON UPDATE SET NULL?`
Andreas ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 07.11.2011, 13:51  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 1.140
PHP-Kenntnisse:
Anfänger
hausl wird schon bald berühmt werdenhausl wird schon bald berühmt werden
Standard

Die Definiton eines FK passiert immer in der "Kind" Spalte. Dort definierst Du welche Werte von einer anderen "Eltern" Tabelle.Spalte (bei Dir: REFERENCES `datenbank`.`user` (`id` )
) dort stehen dürfen.

Wenn nun von der "Eltern" Tabelle ein Satz gelöscht wird, auf den das Kind referenziert, dann definiert Du eben damit was dann mit den Kindern passieren soll, da es ja keine Elternfeferenz mehr gibt.. In deinem Fall wird der nichtmehr existente ID mit NULL upgedated.

Sorry ich kann es gerade nicht besser beschreiben... Jedenfalls legt man den FK Verweis dort an wo man dann sagt und DU bekommst nur Werte von....

Das hier beschreibt es ganz gut (etwas runterscrollen)
http://www.tbee.de/mysql/p5_mysql_foreignkey.php


LG
__________________
Keine Zahl != ein Zeichen das keine Zahl ist
hausl ist offline   Mit Zitat antworten
Alt 07.11.2011, 14:02  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Gut, dann ist es genau so, wie ich es gerne hätte. Wird ein "orderstatus" gelöscht, bleibt die "order" erhalten, der Status wird aber genullt. Allerdings kann ich den obigen SQL-Code nicht ausführen, da dann immer ein

errno 150

kommt. Ändere ich das

ON DELETE SET NULL => ON DELETE CASCADE

funktioniert es. Warum funktioniert ON DELETE SET NULL nicht?
Andreas ist offline   Mit Zitat antworten
Alt 07.11.2011, 14:09  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 1.140
PHP-Kenntnisse:
Anfänger
hausl wird schon bald berühmt werdenhausl wird schon bald berühmt werden
Standard

Da ist NULL in dem Feld verboten??!

Zitat:
orderstatus_id` INT NOT NULL
__________________
Keine Zahl != ein Zeichen das keine Zahl ist

Geändert von hausl (07.11.2011 um 14:17 Uhr).
hausl ist offline   Mit Zitat antworten
Alt 07.11.2011, 16:14  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Huch *lol* Vielen Dank für den Hinweis Jetzt gehts.
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
Mehrere Tabellen verbinden? heinz2 Datenbanken 4 08.11.2011 13:13
Fehler beim Laden der Tabellen neguss Datenbanken 8 05.11.2011 19:29
Daten aus 2 Tabellen ausgeben und sortieren moprhoyz Datenbanken 1 06.03.2011 22:29
Fehler beim erstellen von Tabellen GiS Datenbanken 11 01.02.2011 08:22
[Erledigt] 2 Tabellen abgleichen und Inhalte übernehmen... Abweichler PHP Tipps 2010 3 29.07.2010 20:23
leere Tabellen löschen TobiasH Datenbanken 12 14.06.2010 16:08
[Erledigt] Tabellen fehler bei Ausgabe DjRay PHP Tipps 2009 3 22.11.2009 17:24
Mehrer Tabellen aus Datenbank auslesen? Blade JavaScript, Ajax und mehr 5 17.11.2009 16:08
Tabellen miteinander verknüpfen Suzi Datenbanken 12 27.05.2009 11:40
Registrierte User sollen ihre Daten ändern können 54ch4 PHP Tipps 2009 17 14.03.2009 14:29
Tabellen für Vokabeltrainer anlegen... anonym01 PHP Tipps 2008 9 03.03.2008 21:18
Fehler bei Tabellen {m-d} HTML, Usability und Barrierefreiheit 5 05.03.2005 17:12
Script um MySQL Tabellen untereinander updaten zu können PHP Tipps 2004 2 02.06.2004 16:28

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
constraint-fehler, payback, \`created` timestamp\ \not null\, mysql workbench timestamp not null default, references datenbank

Alle Zeitangaben in WEZ +2. Es ist jetzt 15: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