2017-07-26 203 views
0

我有一个包含三个表的数据库。 表认证包括以下内容:正确创建关系数据库

+----------+-----------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+----------+-----------------+------+-----+---------+----------------+ 
| id  | int(6) unsigned | NO | PRI | NULL | auto_increment | 
| userid | varchar(30)  | NO |  | NULL |    | 
| password | varchar(30)  | NO |  | NULL |    | 
| role  | varchar(20)  | NO |  | NULL |    | 
| email | varchar(50)  | YES |  | NULL |    | 
+----------+-----------------+------+-----+---------+----------------+ 

登录包含以下内容:

+--------------+-----------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+-----------------+------+-----+---------+----------------+ 
| id   | int(6) unsigned | NO | PRI | NULL | auto_increment | 
| TimeLoggedIn | text   | NO |  | NULL |    | 
| sessionid | varchar(255) | NO |  | NULL |    | 
+--------------+-----------------+------+-----+---------+----------------+ 

而且活动时间:

+----------+-----------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+----------+-----------------+------+-----+---------+-------+ 
| id  | int(6) unsigned | NO | PRI | NULL |  | 
| Torrents | mediumtext  | NO |  | NULL |  | 
+----------+-----------------+------+-----+---------+-------+ 

还有就是ID在认证的ID字段之间的关系其他表格。

我需要在Activity中添加多行,并为每个id使用几个Torrents值。不幸的是,当我尝试添加一个新行的值复制ID具有:

INSERT INTO `Activity` (`id`, `Torrents`) VALUES ('1', 'dssfsdffdsffs'); 

它给我的错误:#1062 - Duplicate entry '1' for key 'PRIMARY'

如何解决这个问题呢?我是如何创建表错误的?

我读过以下明显重复的问题:

  1. #1062 - Duplicate entry for key 'PRIMARY'

但是,虽然它说,删除它作为我的主键,MySQL的didnt允许我,除非我犯了创建关系它是主键。

+0

这不是应该发生什么? – Strawberry

+0

@Strawberry你的意思是我不能有包含重复'id'值的行吗? – Droidzone

+1

如果它是主键,则不行。 id和torrents一起形成一个自然的PK,或者你有一个surrogate activity_id列。如果您选择代理键,那么通常会在其余列上形成一个UNIQUE KEY。 – Strawberry

回答

1

您不能通过将主键引用到主键来启动一对多关系。这将是一对一的关系。

在您的登录和活动表中,您都需要有一个外键来引用认证ID。例如:

CONSTRAINT `FK_Login` FOREIGN KEY (`AuthenticationID`) REFERENCES `Authentication` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE 
+0

那么这个新字段AuthenticationID的属性应该是什么? – Droidzone

+1

它应该与您想要引用的密钥相同。因此,如果您的Authentication.ID是int(6)unsigned NOT NULL,则Login和Activity中的外键也必须是int(6)unsigned NOT NULL。 –

+0

@Droidzone请注意,括号中的数字在MySQL中几乎没有意义,所以通常可以省略参数。 – Strawberry