如何在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冲突概率极低,只需简单重试即可:
- 修改模型,去掉自增配置,让ID由应用层传入:
model Item { id Int @id name String link String }
- 编写生成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
相关产品推荐
相关产品推荐

