Prisma 中文文档 下载 App

字段类型与属性:Int、String、@id、@unique、@default 全解析

字段类型速查

Prisma Schema 字段名之后是类型声明。支持的核心类型:

Prisma 类型对应 PostgreSQL对应 MySQL备注
IntINTEGERINT32 位整数
BigIntBIGINTBIGINT64 位整数,Prisma Client 返回 JavaScript BigInt 对象
FloatDOUBLE PRECISIONDOUBLE浮点数
DecimalDECIMALDECIMAL高精度小数,适合金额。Client 返回自定义 Decimal 类
StringTEXT / VARCHARVARCHAR(191) / TEXT字符串,底层类型可通过 @db.VarChar(n) 精确控制
BooleanBOOLEANTINYINT(1)布尔值
DateTimeTIMESTAMP(3)DATETIME(3)精度到毫秒
JsonJSONBJSONJSON 数据,SQLite 不支持
BytesBYTEABLOB二进制数据

类型后面加 ? 表示可空(nullable):

name String?      // 数据库里允许 NULL
bio  String       // NOT NULL

常用属性

属性写在字段类型之后,用 @ 前缀:

@id — 主键

id Int @id

标记这个字段是主键。一张表里必须有且只有一个 @id 字段(或用 @@id 定义复合主键)。

@default — 默认值

id       Int      @id @default(autoincrement())
status   String   @default("active")
created  DateTime @default(now())

常用默认值函数:

@unique — 唯一约束

email String @unique

数据库层面会创建唯一索引,重复值会报错(Prisma Client 抛 P2002 错误码)。

@updatedAt — 自动更新时间

updatedAt DateTime @updatedAt

每次这条记录被更新时,这个字段自动设为当前时间。Prisma Client 在发送 update 请求时会自动带上这个值。

@db.* — 精确控制底层数据库类型

title    String @db.VarChar(255)
content  String @db.Text
amount   Decimal @db.Decimal(10, 2)

默认情况下 Prisma 会为你选一个合理的数据库类型,但当你需要精确控制时用 @db.* 属性。注意这些属性是数据库特定的,跨数据库迁移时可能需要调整。

@relation — 外键关系

author   User? @relation(fields: [authorId], references: [id])
authorId Int?

这个属性告诉 Prisma Client 这两个模型之间存在外键关系。Prisma Client 会根据它生成 include 查询和嵌套写入的类型定义。

块级属性

块级属性用 @@ 前缀,写在 model 定义末尾:

model Post {
  id    Int    @id
  slug  String

  @@unique([slug])
  @@index([authorId])
  @@map("posts")  // 映射到数据库里的真实表名(Prisma model 名和数据库表名不同时)
}
属性作用
@@unique([a, b])多字段组合唯一约束
@@index([a, b])创建数据库索引
@@id([a, b])复合主键(MongoDB 不支持)
@@map("table_name")把 Prisma model 名映射到数据库里不同的表名

Prisma 级字段 vs 数据库级字段

还记得吗——posts Post[] 这种不带 @relation 的关联字段叫 Prisma 级字段,它们在数据库里不会生成任何外键或列。作用纯粹是让 Prisma Client 的 include 类型推断工作得更顺畅。

真正的外键列是你手动声明的,比如 authorId Int? 配合 @relation(fields: [authorId], references: [id])。