字段类型与属性:Int、String、@id、@unique、@default 全解析
字段类型速查
Prisma Schema 字段名之后是类型声明。支持的核心类型:
| Prisma 类型 | 对应 PostgreSQL | 对应 MySQL | 备注 |
|---|---|---|---|
Int | INTEGER | INT | 32 位整数 |
BigInt | BIGINT | BIGINT | 64 位整数,Prisma Client 返回 JavaScript BigInt 对象 |
Float | DOUBLE PRECISION | DOUBLE | 浮点数 |
Decimal | DECIMAL | DECIMAL | 高精度小数,适合金额。Client 返回自定义 Decimal 类 |
String | TEXT / VARCHAR | VARCHAR(191) / TEXT | 字符串,底层类型可通过 @db.VarChar(n) 精确控制 |
Boolean | BOOLEAN | TINYINT(1) | 布尔值 |
DateTime | TIMESTAMP(3) | DATETIME(3) | 精度到毫秒 |
Json | JSONB | JSON | JSON 数据,SQLite 不支持 |
Bytes | BYTEA | BLOB | 二进制数据 |
类型后面加 ? 表示可空(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())
常用默认值函数:
autoincrement()— 自增整数(PostgreSQLSERIAL、MySQLAUTO_INCREMENT)now()— 当前时间戳uuid()— 自动生成 UUID v4(需要数据库支持)cuid()/cuid2()— 生成 CUID 唯一 IDrandom()— 生成 0~1 之间的随机浮点数dbgenerated("...")— 让数据库自己生成,比如dbgenerated("gen_random_uuid()")
@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])。