单行更新时 Prisma 上的排序/排序如何工作?

问题描述 投票:0回答:1

我有一个像这样的 Prisma 模型:

model Table1 {
  id     String    @id @default(cuid())
  name            String
  table2          Table2[]
  type            ReviewType @default(Null)
  subType         SubType   @default(Null)
  isDefault       Boolean
  accountId       String
  dateCreated     DateTime  @default(now())
  dateModified    DateTime  @updatedAt

  @@unique([name, type, subType])
}

model Table2 {
  id    String    @id @default(cuid())
  name                String
  checklistId         String
  checklistItem       Table3[]
  accountId           String
  type                String
  table1              Table1   @relation(fields: [checklistId], references: [id])
  dateCreated         DateTime    @default(now())
  dateModified        DateTime    @updatedAt

  @@index([id])
  @@index([name])
  @@index([checklistId])
}

model Table3 {
  id     String    @id @default(cuid())
  name                String
  checklistGroupId    String
  accountId           String
  type                String
  Table2              Table2 @relation(fields: [checklistGroupId], references: [id])
  dateCreated         DateTime    @default(now())
  dateModified        DateTime    @updatedAt

  @@index([checklistGroupId])
  @@index([id])
  @@index([name])
}

我有一个种子数据将填充我们的数据库。我只是想问当我更新 Table2 的一条记录时 prisma 的行为是什么,因为更新时它将位于数据的底部,并且在我的 get 方法中对表的请求现在已重新排序。

用户没有从种子中更新行记录的名称字段(顺序对我来说很重要)

1
2
3
4
5

用户更新了第一行记录的名称字段

2
3
4
5
1 <- updated

然后当我检索记录号1时,现在已经在底部了。

sql prisma
1个回答
0
投票

说明

当您在更新后获取记录时,您在 Prisma 中看到的内容与 Prisma 无关,而是数据库如何实际存储和检索行,因为数据库实际上并不保证行的顺序,除非您实际上包含

ORDER BY
您查询中的子句。

当您更新一行时,数据库并不总是维护该行的原始物理位置。在某些情况下,更新的行可能会放置在底层存储结构中的新位置,这可能会导致结果的顺序出现不同。

在您的情况下,更新的行出现在底部,因为数据库(以及扩展的 Prisma)以不确定的顺序检索行,除非显式排序。当您更新记录时,它可以触发重组,并且在不指定顺序的情况下,数据库会按存储的方式返回结果,这看起来像是重新排序。

可行的解决方案

为了在查询中保持一致的行顺序,您需要在获取记录时添加显式的 ORDER BY 子句。例如,如果您想按照插入的顺序检索行,您可以按 dateCreated 或 id 对它们进行排序(如果您的 id 是连续的)。

const table2Records = await prisma.table2.findMany({
  orderBy: {
    dateCreated: 'asc',  // or 'id' if appropriate
  },
});
© www.soinside.com 2019 - 2024. All rights reserved.