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

标签 java mysql sql jpa eclipselink

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

  1. 创建一个介于 0-9999999999 之间的随机 key (9999999999 是我的最大值)
  2. 使用新创建的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/

相关文章:

Java 转换类

java - HQL delete query 和 session.delete() 的区别

javascript - Java 与 JavaScript 拆分行为

php - 如何对学说中的列重新编号

php - 如何解码mysql_real_escape_string

java - ButterKnife 5.1.1 Proguard 错误

MYSQL GUID 触发器

java - 我的查询有什么问题吗?它完全没有错误

mysql - 为什么这个 sql 查询不断向我显示语法错误

Mysql表或查询优化