1

我使用 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' (errno: 150)”。

4

2 回答 2

2

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

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

于 2012-04-11T23:03:12.083 回答
1

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

来自 MySQL 文档,版本 5.1,CREATE TABLE语法

笔记

较旧的TYPE选项与ENGINE. TYPE 自 MySQL 4.0起已弃用,但仍支持 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)一个且只有一个用户(用户表中的行)。


尽管(出于各种原因)最佳实践是将窄(小)和恒定宽的列作为外键。你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;
于 2012-04-11T23:18:49.953 回答