2017-07-08 81 views
0

我建立一个问答网站并因此当用户要求它必须链接到一个问题将使用者帐户我想有从登录表中的用户名是问表的外键的问题他或她的用户名。我可以不具有varchar数据类型的外键吗?或者,外键只能是另一个表的主键?我收到的错误说'密钥列''用户名'在表中不存在“。我究竟做错了什么?SQL不会允许我添加外键?

create table login (user_id int NOT NULL AUTO_INCREMENT, username 
varchar (100), password varchar (100), primary key (user_id)); 

create table questions (q_id int not null auto_increment, question 
varchar (100), primary key (q_id), foreign key (username) references 
login (username)); 

回答

1

我想这是你想要什么:

create table login (username 
varchar (100), password varchar (100), primary key (username)); 

create table questions (q_id int not null auto_increment, question 
varchar (100), primary key (q_id), username varchar(100),foreign key (username) references 
login (username)); 

create table answers (a_id int not null auto_increment, answer varchar (100), primary key (a_id), q_id int, foreign key (q_id) references questions (q_id)); 

我测试了它在这里:http://sqlfiddle.com/#!9/61ec2a

您需要:

1) Make Login.UserName unique 
2) Declare UserName in the questions table 
+0

是谢谢我认为这不能解决问题,因为我也有一个答案表的q_id是一个外键。感谢帮助! – do734

+0

不要忘记将问题标记为已回答,如果它对您的帮助最大。让我知道是否需要澄清任何事情。 – w0051977

+0

我是新来这个网站,并会给你一个观点,如果我可以但他们不会让我。我会弄清楚如何回答,因为这确实奏效,我感谢你!还有一个问题。现在我试图让我的答案表,但它不工作。当我之前做到这一点时,它很有用,但不是现在。看到有什么不对? – do734

0

记住,外键是一个关键,应该期待与其他重点链接。现在,username是简单的列在一个表中,那么它怎么能另一个表键列?

外键的目的是显示表之间的关系。你必须在表格中有相同的列,你将要涉及。

+0

好的谢谢。所以,如果我正确理解一个外键需要链接到一个主键只意味着我应该采取不同的方法来链接用户名和q_id权利?还是有办法做我想做的事情? – do734

+0

不行,它必须与** **键列链接,并且甚至可以**唯一键** – Ravi

0

两个问题在这里:

  1. 您的问题表没有一个用户名的列。它必须。即使这样也不会因为问题2.
  2. 一般情况下工作,你的外键引用需要使用USER_ID,而不是用户名。原因是Fk引用通常从列开始并以主键值结束。 (q_id int not null auto_increment,user_id int not null,问题varchar(100),主键(q_id),外键(user_id)引用登录名(user_id));创建表问题(012)

这里是一个related question更详尽的阐述:

0

正确的方法是,

create table login (user_id int NOT NULL AUTO_INCREMENT, username 
varchar (100), password varchar (100), primary key (user_id)); 

create table questions (q_id int not null auto_increment, question 
varchar (100), primary key (q_id), foreign key (user_id) references 
login (user_id));