我试图增加我的MySQL数据库模式的约束,为每个表添加外键约束。
表1:用户
+---------+----------+-------------
| id | username | Other fields
+---------+----------+-------------
| 1 | John |
| 2 | Mark |
+---------+----------+-------------
id
INT(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 |
+---------+----------+-----------+-------------
id
INT(11)UNSIGNED NOT NULL AUTO_INCREMENT
id_user
INT(11)不为空,
主键(id
,id_user
)索引fk_disks_idx
(id
ASC)
约束fk_disks
外键(id
)
引用数据库
。用户
(ID
)
删除时无操作
更新时无操作)
表3:文件(这与磁盘有一对多的关系)
+---------+----------+----------+-----------+-------------
| id | id_disk | id_user | file_name | Other fields
+---------+----------+----------+-----------+-------------
| 1 | 1 | 1 | |
| 2 | 2 | 2 | |
+---------+----------+----------+-----------+-------------
id
INT(11)UNSIGNED NOT NULL AUTO_INCREMENT
id_user
INT(11)不为空
id_disk
INT(11)不为空
主键(id
,id_disk
,id_user
)html" target="_blank">索引fk_files_idx
(id
ASC,id_user
ASC)
约束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 | |
+-------+----------+----------+----------+-----------+-------------
id
INT(11)UNSIGNED NOT NULL AUTO_INCREMENT
id_files
INT(11)不为空,
id_user
INT(11)不为空,
id_disk
INT(11)不为空,
主键(id
,id_files
,id_user
,id_disk
)索引fk_files_on_nas_idx
(id
ASC)
约束fk_files_on_nas
外键(id_files
,id_user
,id_disk
)
引用数据库
。文件
(ID
,ID_USER
,ID_DISK
)
删除时无操作
更新时无操作)
正如您所看到的,我在cascade中引用的表越多,得到的主键就越多。如何设计数据库以避免主键的复制,从而避免数据重复?我是否应该删除每个表的自动递增键?这是一个好的做法吗?
谢谢
我强烈建议不要删除自动增加的键。
但是,您不需要每次都创建一个新的主键:
id_disk
外键
id_user
的外键放在磁盘中。只有在面对多对多关系时才使用这样的主键。在这种情况下,您需要创建一个新表来连接这两个表;将两个表的主键作为外键,生成一个耦合的主键,就像您所做的那样。
磁盘的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引擎,所以我知道我可以设置索引键为外键。