我可以通过 JPA 或在数据库级别为数据库表主键设置 MAX 值吗?如果不可能,那么我正在考虑
- 创建一个介于 0-9999999999 之间的随机
key
(9999999999 是我的最大值) - 使用新创建的
key
对数据库进行SELECT,如果返回对象为null
,则INSERT,如果不是则重复返回步骤1
因此,如果我执行上述操作,就会出现两个问题。请记住环境是高并发的:
Q1:使用 SELECT 检查的开销(如果没有)是否很大?我真正的意思是:这个过程正常吗,因为通常我让数据库为我创建一个独特的PK?
问题 2:如果问题 1 没有造成显着的性能下降,我会遇到并发问题吗?例如,如果P1用Id1查表,Id1不存在,它准备插入,P2在P1之前偷偷插入Id1。所以当P1插入Id1时,失败。我不希望该过程在这里失败,我希望它返回循环,找到一个新的 id,重复该过程。我该怎么做?
我的环境是SQL和MYSQL数据库。我使用 JPA 和 Eclipselink 实现
注意:有些人质疑我以这种方式实现它的决定,答案正是下面 TravisJ
建议的那样。我有一个非常高并发的环境。当一个进程启动时,我需要创建对另一个进程的请求,并向该进程传递一个唯一的 10 个字符长的 ID。由于环境是高电流,我想利用 PK 独特的非空特性。该请求包含大量信息,因此我创建了一个 Request
表,并将请求 Id 作为我的 PK。我知道由于所有数据库都索引了它们的 PK,因此查询 PK 的速度很快。如果有更好的方法,请告诉我。
最佳答案
您可以在表定义中实现检查约束:
CREATE TABLE P
(
P_Id int PRIMARY KEY NOT NULL,
...
CONSTRAINT chk_P_Id CHECK (P_Id>0 and P_Id<9999999999)
)
编辑:正如评论中所述,MySql 不遵守 CHECK 约束。这是错误日志中已有 6 年历史的缺陷,MySql 团队尚未修复它。由于MySql现在由Oracle公司监管,它可能永远不会被修复(简单地认为是“记录的限制”,不喜欢它的人可以升级到付费的DBMS)。但是,此语法以及检查约束功能本身可以在 Oracle、MS SQL Server(包括 SQLExpress/MSDE)、MS Access、Postgre 和 SQLite 中工作。
关于java - 我可以为数据库表主键设置一个 MAX 值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10019098/