2012-04-11 10 views
1

war ich Tabellen mit der Syntax in phpMyAdmin erstellen:SQL Fremdschlüssel

DROP TABLE IF EXISTS users; 
DROP TABLE IF EXISTS info; 

CREATE TABLE users (
    user_id int unsigned NOT NULL auto_increment, 
    email varchar(100) NOT NULL default '', 
    pwd varchar(32) NOT NULL default '', 
    isAdmin int(1) unsigned NOT NULL, 
    PRIMARY KEY (user_id) 
) TYPE=INNODB; 

CREATE TABLE info (
    info_id int unsigned NOT NULL auto_increment, 
    first_name varchar(100) NOT NULL default '', 
    last_name varchar(100) NOT NULL default '', 
    address varchar(300) NOT NULL default '', 
    zipcode varchar(100) NOT NULL default '', 
    personal_phone varchar(100) NOT NULL default '', 
    mobilephone varchar(100) NOT NULL default '', 
    faxe varchar(100) NOT NULL default '', 
    email2 varchar(100) NOT NULL default '', 
    country varchar(100) NOT NULL default '', 
    sex varchar(1) NOT NULL default '', 
    birth varchar(1) NOT NULL default '', 

    email varchar(100) NOT NULL default '', 
    PRIMARY KEY (info_id), 
    FOREIGN KEY (email) REFERENCES users(email) ON UPDATE CASCADE ON DELETE CASCADE 
) TYPE=INNODB; 

Aber zeigt den Fehler:

"#1064 - 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 'TYPE=INNODB' at line 11 "

Wenn ich den TYPE = INNODB am Ende erstellen, um die Tabellen zu entfernen, Es wird der Fehler angezeigt:

"#1005 - Can't create table 'curriculo.info' (errno: 150) ".

Antwort

1

Verwenden Sie ENGINE = INNODB, nicht TYPE = InnoDB.

Von MySQL-Dokumentation, Version 5.1, CREATE TABLE syntax:

Note

The older TYPE option was synonymous with ENGINE . TYPEhas been deprecated since MySQL 4.0 but is still supported for backward compatibility in MySQL 5.1 (excepting MySQL 5.1.7). Since MySQL 5.1.8, it produces a warning. It is removed in MySQL 5.5. You should not use TYPE in any new applications, and you should immediately begin conversion of existing applications to use ENGINE instead. (See Section D.1.64, “Changes in MySQL 5.1.8 (Not released)”.)


Wenn Sie diesen Fremdschlüssel haben wollen:

FOREIGN KEY (email) REFERENCES users(email) 

die users(email) sollte eine UNIQUE Einschränkung haben. Alle Fremdschlüssel sollten entweder einen primären oder einen eindeutigen Schlüssel referenzieren. Sie möchten eine Zeile in der Tabelle info, um (über die FK) einen einzigen Benutzer (Zeile in der Benutzertabelle) zu referenzieren.


Best Practice obwohl (aus verschiedenen Gründen) ist schmal (klein) zu haben und konstant weite Spalt als Fremdschlüssel. Ihre email ist 100 Zeichen, die von 100 bis 300 Bytes (abhängig vom Zeichensatz) sein können. So können Sie mit user_id als FK betrachten, die breit nur 4 Bytes ist:

CREATE TABLE info (
    ... 
      ---- email varchar(100) NOT NULL default '', 
      ---- removed 
    user_id int unsigned NOT NULL, 
    PRIMARY KEY (info_id), 
    FOREIGN KEY (user_id) REFERENCES users(user_id) 
     ON UPDATE CASCADE ON DELETE CASCADE 
) TYPE=INNODB; 
+0

Wenn ich nicht Geben Sie die Engine an, die er standardmäßig verwendet, aber der Fehler "# 1005 - Tabelle kann nicht erstellt werden curriculo.info '(errno: 150)" wird fortgesetzt. –

+0

Wahrscheinlich, weil Sie keinen 'UNIQUE KEY (email)' haben in der Tabelle "Benutzer" –

+0

Ja, das war es! Danke –

2

Versuchen Sie "Engine = INNODB" am Ende der Erstellung. (nicht TYPE)

Wenn Sie es nicht haben, funktioniert es möglicherweise nicht, da es von Ihrem Standard-Motortyp in den MySQL-Voreinstellungen abhängt ... MyIsam (die am häufigsten verwendete Standard-Engine) unterstützt keine Fremdschlüssel.

+0

ich den Befehl „show Tabellenstatus;“ und es wurde gezeigt, dass der Typ INNODB ist. –

+0

versuchen: zeigen Sie erstellen Tabelle und das könnte Ihnen mehr Informationen geben. Ich bin mir nicht sicher, warum mysql in diesem Fall Typ und Engine verwechselt. Wenn Sie jedoch nachsehen: http://dev.mysql.com/doc/refman/5.1/en/create-table.html sehen Sie dort das Schlüsselwort Engine . –

+0

zeigt "ENGINE = InnoDB DEFAULT CHARSET = latin1" aber weiterhin mit dem Fehler "" # 1005 - Kann Tabelle 'curriculo.info' (errno: 150) nicht erstellen "Hexe ich denke, es ist ein ausländischer Fehler, –

Verwandte Themen