SQL外键问题

时间:2012-02-06 07:34:39

标签: mysql sql

我遇到了MySQL的一个问题,看似简单的添加了一个外键。我问谷歌,但无济于事。这是:

使用以下命令创建第一个表:

| users | CREATE TABLE `users` (
  `username` varchar(32) NOT NULL DEFAULT '',
  `firstname` varchar(128) DEFAULT NULL,
  `lastname` varchar(128) DEFAULT NULL,
  `password` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

使用以下内容创建第二个表:

| contacts | CREATE TABLE `contacts` (
  `username` varchar(32) DEFAULT NULL,
  `name` varchar(128) DEFAULT NULL,
  `phonenumber` varchar(32) DEFAULT NULL,
  `address` varchar(128) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

现在我需要添加一个将“联系人”与“用户”相关联的外键。

ALTER TABLE contacts ADD FOREIGN KEY (username) references USERS(username));

但是我收到了这个错误: 错误1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的')'附近使用正确的语法

目标显然是确保“联系人”中的所有条目在“用户”中都有相应的“用户名”条目。

环境:Ubuntu 11.04,MySQL 5.1.58

我必须在某个地方犯一个愚蠢的错误。建议欢迎。

2 个答案:

答案 0 :(得分:5)

ALTER TABLE contacts ADD FOREIGN KEY (username) references USERS(username));

在行尾有一个额外的括号。

应该是

ALTER TABLE contacts ADD CONSTRAINT FOREIGN KEY (username) references USERS(username);

答案 1 :(得分:5)

首先,将这两个表格的引擎从MyISAM更改为InnoDB。 MyISAM不支持FOREIGN KEY约束:

ALTER TABLE users
ENGINE = InnoDB ;

ALTER TABLE contacts
ENGINE = InnoDB ;

然后添加FOREIGN KEY,删除额外的括号。有两种方法可以做到这一点。使用您拥有的代码,它将自动在列username上添加索引(键):

ALTER TABLE contacts 
  ADD FOREIGN KEY (username) 
    REFERENCES users(username);

或者自己添加索引(Key)和外键约束(你自己也选择索引和约束的名称):

ALTER TABLE contacts 
  ADD KEY username_ie (username),
  ADD CONSTRAINT users_contacts_fk
    FOREIGN KEY (username) 
    REFERENCES users(username);