【问题标题】:Properly creating a relational database正确创建关系数据库
【发布时间】:2017-07-26 09:04:07
【问题描述】:

我有一个包含三个表的数据库。 表 Authentication 包含以下内容:

+----------+-----------------+------+-----+---------+----------------+
| 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    |       |
+----------+-----------------+------+-----+---------+-------+

Authentication 的 id 字段与其他表中的 id 之间存在关系。

我需要在 Activity 中添加多行,每个 id 有几个 Torrent 值。不幸的是,当我尝试添加具有重复 id 值的新行时:

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

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

我该如何解决?我怎么创建表错了?

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

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

虽然它说要删除它作为我的主键,但 mysql 不允许我创建关系,除非我将它设为主键。

【问题讨论】:

  • 这不是应该发生的事情吗?
  • @Strawberry 你的意思是我的行不能包含重复的id 值吗?
  • 如果它是主键则不会。要么 id 和 torrent 一起形成一个自然的 PK,要么你有一个替代的 activity_id 列。如果您选择代理键,那么通常会在剩余的列上形成一个 UNIQUE KEY。
  • @Strawberry 如果我没有将其设为主键,我将无法创建关系。那么我该如何解决呢?将另一个字段设为主要字段?我还能创建与 id 字段的关系吗?

标签: mysql relational-database


【解决方案1】:

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

在您的 Login 和 Activity 表中,您需要有一个外键来引用 Authentication 的 ID。示例:

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

【讨论】:

  • 那么这个新字段AuthenticationID的属性应该是什么?
  • 应该和你要引用的key一样。因此,如果您的 Authentication.ID 是 int(6) unsigned NOT NULL,则 Login 和 Activity 中的外键也必须是 int(6) unsigned NOT NULL。
  • @Droidzone 请注意,括号内的数字在 MySQL 中(几乎)没有意义,因此通常可以省略该参数。
猜你喜欢
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多