gpt4 book ai didi

java - 我可以为数据库表主键设置一个 MAX 值吗?

转载 作者:行者123 更新时间:2023-11-29 01:31:47 24 4
gpt4 key购买 nike

我可以通过 JPA 或在数据库级别为数据库表主键设置 MAX 值吗?如果不可能,那我在想

  1. 创建一个介于 0-9999999999 之间的随机 key(999999999 是我的 MAX)
  2. 用新创建的在数据库上做一个SELECT,如果返回对象是null,然后INSERT,如果不是重复回到步骤1

所以,如果我执行上述操作,有两个问题。请记住环境是高并发的:

问题 1:使用 SELECT(如果没有)检查 INSERT 的开销是否显着?我真正的意思是:这个过程是否正常,因为通常我让 DB 为我创建一个唯一的 PK?

Q2:如果 Q1 没有造成明显的性能下降,我会遇到并发问题吗?例如,如果 P1 与 Id1 检查表,Id1 不存在,它准备插入,P2 在 P1 可以插入 Id1 之前潜入。所以当 P1 插入 Id1 时,它失败了。我不希望这个过程在这里失败,我希望它回到循环中,找到一个新的 id,重复这个过程。我该怎么做?

我的环境是 SQL 和 MYSQL 数据库。我将 JPA 与 Eclipselink 实现结合使用

注意:有些人质疑我以这种方式实现它的决定,答案正是 TravisJ 下面的建议。我有一个非常高的并发环境。当一个进程启动时,我需要创建一个对另一个进程的请求,向该进程传递一个唯一的 10 个字符长的 ID。由于环境是高电流,我想利用 PK 的独特的、非空的特性。请求中包含很多信息,因此我创建了一个 Request 表,并将请求 ID 作为我的主键。我知道因为所有数据库都索引了他们的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com