SQL外键

时间:2012-04-11 22:57:47

标签: sql phpmyadmin foreign-keys foreign-key-relationship

我使用phpmyadmin中的语法创建表:

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 - 您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以便在第11行的'TYPE = INNODB'附近使用正确的语法”

如果在创建表格的最后删除TYPE = INNODB,则会显示错误:

  

“#1005 - 无法创建表'curriculo.info'(错误号:150)”。

2 个答案:

答案 0 :(得分:2)

在创建结束时尝试“Engine = INNODB”。 (不是TYPE)

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

答案 1 :(得分:1)

使用ENGINE = INNODB,而不是TYPE = InnoDB

来自MySQL文档,版本5.1,CREATE TABLE syntax

  

注意

     

较旧的TYPE选项与ENGINE同义。自MySQL 4.0起,TYPE 已被弃用,但仍然支持MySQL 5.1中的向后兼容性(MySQL 5.1.7除外)。 自MySQL 5.1.8起,它会产生警告 在MySQL 5.5中删除。您不应在任何新应用程序中使用TYPE,而应立即开始转换现有应用程序以使用ENGINE。 (参见第D.1.64节“MySQL 5.1.8中的变化(未发布)”。)


如果你想拥有这个外键:

FOREIGN KEY (email) REFERENCES users(email)

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


尽管(出于各种原因)最佳实践是将窄(小)和常数宽列作为外键。您的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;