当前位置: 首页 > 知识库问答 >
问题:

使用生成的主键引用表

百里杰
2023-03-14

我试图增加我的MySQL数据库模式的约束,为每个表添加外键约束。

表1:用户

    +---------+----------+-------------
    | id      | username | Other fields
    +---------+----------+-------------
    | 1       | John     |
    | 2       | Mark     |
    +---------+----------+-------------

idINT(11)UNSIGNED NOT NULL AUTO_INCREMENT

username`VARCHAR(50)不为空

主键(ID)

表2:磁盘(这与用户有一对多的关系)

    +---------+----------+-----------+-------------
    | id      | id_user  | disk_name | Other fields
    +---------+----------+-----------+-------------
    | 1       | 1        | disk A    |
    | 2       | 2        | disk B    |
    +---------+----------+-----------+-------------

idINT(11)UNSIGNED NOT NULL AUTO_INCREMENT

id_userINT(11)不为空,

主键(id,id_user)索引fk_disks_idx(idASC)

约束fk_disks

外键(id)

引用数据库用户(ID)

删除时无操作

更新时无操作)

表3:文件(这与磁盘有一对多的关系)

    +---------+----------+----------+-----------+-------------
    | id      | id_disk  | id_user  | file_name | Other fields
    +---------+----------+----------+-----------+-------------
    | 1       | 1        | 1        |           |
    | 2       | 2        | 2        |           |
    +---------+----------+----------+-----------+-------------

idINT(11)UNSIGNED NOT NULL AUTO_INCREMENT

id_userINT(11)不为空

id_diskINT(11)不为空

主键(id,id_disk,id_user)html" target="_blank">索引fk_files_idx(idASC,id_userASC)

约束fk_files

外键(id_disk,id_user,id_user)

引用数据库磁盘(ID)

删除时无操作

更新时无操作)

表2:FILES_ON_NAS(这与文件有一对一的关系)

    +-------+----------+----------+----------+-----------+-------------
    | id    | id_files | id_user  | id_disk  | file_name | Other fields
    +-------+----------+----------+----------+-----------+-------------
    | 1     | 1        | 1        | 1        |           |
    | 2     | 1        | 2        | 2        |           |
    +-------+----------+----------+----------+-----------+-------------

idINT(11)UNSIGNED NOT NULL AUTO_INCREMENT

id_filesINT(11)不为空,

id_userINT(11)不为空,

id_diskINT(11)不为空,

主键(id,id_files,id_user,id_disk)索引fk_files_on_nas_idx(idASC)

约束fk_files_on_nas

外键(id_files,id_user,id_disk)

引用数据库文件(ID,ID_USER,ID_DISK)

删除时无操作

更新时无操作)


正如您所看到的,我在cascade中引用的表越多,得到的主键就越多。如何设计数据库以避免主键的复制,从而避免数据重复?我是否应该删除每个表的自动递增键?这是一个好的做法吗?

谢谢

共有2个答案

淳于新
2023-03-14

我强烈建议不要删除自动增加的键。

但是,您不需要每次都创建一个新的主键:

  • 如果希望多个用户共享一个磁盘,只需在users
  • 中放入 id_disk外键
  • 如果希望一个用户可以拥有多个磁盘,请将id_user的外键放在磁盘中。

只有在面对多对多关系时才使用这样的主键。在这种情况下,您需要创建一个新表来连接这两个表;将两个表的主键作为外键,生成一个耦合的主键,就像您所做的那样。

韦晟睿
2023-03-14

磁盘的ID足以唯一标识磁盘。因此没有理由将用户的ID包含在磁盘的主键中。这甚至是一个非常糟糕的主意,因为这意味着如果磁盘的用户更改,您将需要修改主键。

文件也一样。文件ID唯一地标识一个文件。因此没有理由将磁盘ID添加到文件的主键中。

 类似资料:
  • 我知道这似乎已经讨论过了,答案是肯定的,可以为不同的字符串生成相同的值,但不太可能(Java的hashCode可以为不同的字符串生成相同的值吗?)。然而,它确实发生在我的应用程序中。 以下代码将生成相同的hashcode:-347019262(jave 1.7.25) 在这种情况下,我确实需要hashcode,我希望使用它为字符串生成唯一的主键。看来我做得不对。有什么建议吗? 多谢!

  • 要用jooq创建一张唱片,我说 这将引发一个id为null的约束冲突异常。如果我设置一个id(如 我没有得到异常,但postgres不会自动生成值。 http://www.postgresql.org/docs/current/static/datatype-numeric.html#datatype-serial的postgres文档指出“在INSERT中省略SERIAL列,或者指定DEFAUL

  • 我在Talend创建了一个作业,其中我必须生成包含用tRowGenerator生成的数据的文件,以及其他源:SQL Server数据库和分隔文件。 问题是我有相同主键的重复文件。我只想获得100条记录(420行):对于每个随机生成的UUID,我将获得42行,以此类推,但相反,我将获得相同的行10次(它重复了10次)

  • 有时,当函数具有这样的签名时,它可能会变得毛茸茸的: 对于编译器来说,所有UUID都是相同的,因此希望在运行时被数据库捕获。 我喜欢jOOQ在编译时捕获许多问题的方式,我也想解决这个问题。我的目标是让每个表的每个键都有自己的类,并让这些字段正确生成pojos。 实现这一目标的最佳方法是什么?我想出了以下几点: 全面的JavaGenerator实现 具有大量强制类型映射的转换器,以及手动创建的键类

  • 问题内容: 我的主键实体如下所示 当我跑步时,出现错误 无法获取或更新下一个值;嵌套的异常是org.hibernate.exception.SQLGrammerException:无法获取或更新下一个值 但是当我改变为 没有错误抛出。我想在 oracle db 上为每个表生成唯一的主键。 问题答案: 当将新创建的实体插入数据库时,告诉JPA提供者使用表从中获取ID。 当使用Hibernate作为提

  • 我在model和model之间有一个关系。这意味着每个用户都有0或1个总统设置。因此,表的主索引与外键相同。 这就是我想要添加外键的方式: 但是我得到以下错误: 我怎么才能修好它?我使用InnoDB引擎,所以我知道我可以设置索引键为外键。