2012-04-11 39 views
1

我创建表与phpMyAdmin的语法:SQL外键

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; 

但显示了错误:

"#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 "

如果我删除TYPE = INNODB在创建表的末尾,它会显示错误:

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

回答

1

使用ENGINE = INNODB而不是TYPE = InnoDB

从MySQL的文档,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)”.)


如果你想有这样的外键:

FOREIGN KEY (email) REFERENCES users(email) 

users(email)应该有一个UNIQUE约束。所有外键都应引用主键或唯一键。您需要info表中的一行来引用(通过FK)一个且只有一个用户(用户表中的行)。


尽管(由于各种原因)最佳做法是将窄(小)和恒定宽度的列作为外键。您的email是100个字符,可能是100到300个字节(取决于字符集)。所以,你可以考虑使用user_id作为FK,它只有4个字节宽:

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

如果我没有指定他默认使用的引擎,但错误“#1005 - 无法创建表'curriculo.info'(errno:150)” – 2012-04-11 23:25:29

+0

可能因为您没有'UNIQUE KEY(email)在'users'表中。 – 2012-04-11 23:29:33

+0

是的,就是这样!谢谢 – 2012-04-11 23:35:36

2

尝试“发动机= INNODB”在的创建结束。 (不是TYPE)

如果您没有它,它可能无法正常工作,因为它取决于您的默认引擎类型在mysql首选项中... MyIsam(最常见的默认引擎)不支持外键。

+0

我执行命令“show table status;”并且显示该类型是INNODB。 – 2012-04-11 23:09:36

+0

尝试:显示创建表,这可能会给你更多的信息。不知道为什么mysql在这种情况下混淆了类型和引擎..但如果你看看:http://dev.mysql.com/doc/refman/5.1/en/create-table.html你会看到引擎关键字在那里。 – 2012-04-11 23:11:58

+0

显示“ENGINE = InnoDB DEFAULT CHARSET = latin1”,但继续出现错误“”#1005 - 无法创建表'curriculo.info'(errno:150)“女巫我认为它是一个国外错误, – 2012-04-11 23:23:47