我遇到了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
我必须在某个地方犯一个愚蠢的错误。建议欢迎。
答案 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);