首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypeORM -重复的键值冲突

TypeORM -重复的键值冲突
EN

Stack Overflow用户
提问于 2021-06-18 14:53:55
回答 2查看 8.5K关注 0票数 3

假设我有一个简单的TypeORM实体,如下所示:

代码语言:javascript
运行
复制
import { Entity, PrimaryGeneratorColumn, Column } from 'typeorm';

@Entity()
export class Employee {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    Name: string;
}

只要我不手动触摸数据库,它就能正常工作。如果我手动输入记录,该实体将无法从表中检查当前的最后一个id并抛出错误duplicate key value violates unique constraint

例如:

  1. Employee Entity自己创建了两条记录。id 2
  2. I
  3. 在我的数据库中有两条记录,最后一条记录在数据库中手动创建第三条记录,当Employee Entity运行时它有id 3
  4. Afterwards,,它不=创建另一条记录,因为它想使用id 3,但我已经手动添加了。
  5. I but duplicate key value violates unique constraint
  6. When Employee Entity再次运行,因为它试图在id 4下保存另一条可用的记录。

G 224

那么如何确保Employee Entity检查数据库中的最后一个id,然后用增量id保存下一个记录

谢谢

EN

回答 2

Stack Overflow用户

发布于 2021-07-01 16:23:24

在TypeORM中,装饰符@PrimaryGeneratedColumn()创建一个主列,该列将使用序列生成值。每次在数据库中添加新记录时,它都会使用该列设置的序列的nextval。假设您正在使用PostgreSQL (我相信对于其他数据库,它将是类似的),那么您有一个Employee表

代码语言:javascript
运行
复制
CREATE TABLE public.Employee (
    number serial NOT NULL,
    nane varchar NULL
);

因为装饰器@PrimaryGeneratedColumn(),也会创建一个序列employee_id_seq。您可以通过运行

代码语言:javascript
运行
复制
select last_value from employee_id_seq; 

当应用程序创建两个记录时,它将使用序列生成新的ids,从而更改employee_id_seq last_value值。使用数据库中的两条记录,新的last_value将被更新为2。

如果您创建第三条记录,手动传递id =3

代码语言:javascript
运行
复制
INSERT INTO public.Employee (id, name) VALUES(3, 'new_name')

该序列将不被使用,其last_value为2。下次应用程序尝试插入一个新记录时,它将执行插入而不传递id,因为它依赖于序列来生成值,如下所示

代码语言:javascript
运行
复制
INSERT INTO public.Employee (name) VALUES('another_name');

或者(不确定TypeORM如何准确地处理它)

代码语言:javascript
运行
复制
INSERT INTO public.Employee (id, name) VALUES(nextval('employee_id_seq', 'another_name')

上面的SQL将使用序列中的last_value并添加1,从而生成3和duplicate key violation。因此,如果手动添加记录不需要手动设置id,则可以运行

代码语言:javascript
运行
复制
INSERT INTO public.Employee (name) VALUES('name') 

使用序列自动生成id。

票数 5
EN

Stack Overflow用户

发布于 2022-02-03 15:16:52

在我的例子中,我错误地定义了一种关系。本来应该是@ManyToOne,但我有@OneToOne。这是有意义的,因为OneToOne应该对每个实体都有一个实例,因此序列生成器为每个尝试的插入提供相同的id,这会导致错误,因为它对于后续的保存并不是唯一的。我认为TypeORM应该给出不同的错误信息,花了我两天的时间才弄明白。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68037334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档