You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLite Prisma数据库中设置随机整数ID?

实现方案

方案一:利用数据库内置函数生成随机ID(最简便)

直接在Prisma模型里用数据库的随机函数作为ID的默认值,无需在应用层写额外逻辑。不同数据库写法略有差异:

PostgreSQL 版本

model Item {
  id            Int     @id @default(dbgenerated("floor(random() * 100000000000000)"))
  name          String
  link          String
}

执行prisma db push或prisma migrate dev更新数据库后,创建Item时Prisma会自动调用数据库函数生成符合范围的随机整数ID。

MySQL 版本

model Item {
  id            Int     @id @default(dbgenerated("floor(rand() * 100000000000000)"))
  name          String
  link          String
}

方案二:应用层生成ID并处理冲突

如果不想依赖数据库函数,也可以在应用层生成随机ID。由于范围覆盖0到99999999999999(共100万亿个可能值),ID冲突概率极低,只需简单重试即可:

  1. 修改模型,去掉自增配置,让ID由应用层传入:
model Item {
  id            Int     @id
  name          String
  link          String
}
  1. 编写生成ID的工具函数,创建Item时调用并处理冲突:
// 生成指定范围的随机整数
function generateRandomId() {
  return Math.floor(Math.random() * 100000000000000);
}

// 创建Item的函数,带冲突重试逻辑
async function createItem(data) {
  let retries = 3; // 设置重试次数,足以应对极低概率的冲突
  while (retries > 0) {
    try {
      const id = generateRandomId();
      return await prisma.item.create({
        data: { ...data, id }
      });
    } catch (error) {
      // 捕获唯一约束冲突错误
      if (error.code === 'P2002' && retries > 0) {
        retries--;
        continue;
      }
      throw error;
    }
  }
  throw new Error("多次尝试生成唯一ID失败");
}

注意事项

  • 两种方案都需要确保ID字段保留@id标识,同时移除@autoincrement()以禁用自增机制。
  • 数据库函数方案的优势是零额外代码,完全由数据库处理;应用层方案更灵活,适配多数据库环境或需要自定义ID规则的场景。

内容的提问来源于stack exchange,提问作者PixelPage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:50:23