假设我有一个简单的TypeORM实体,如下所示:
import { Entity, PrimaryGeneratorColumn, Column } from 'typeorm';
@Entity()
export class Employee {
@PrimaryGeneratedColumn()
id: number;
@Column()
Name: string;
}
只要我不手动触摸数据库,它就能正常工作。如果我手动输入记录,该实体将无法从表中检查当前的最后一个id
并抛出错误duplicate key value violates unique constraint
。
例如:
Employee Entity
自己创建了两条记录。id 2
Employee Entity
运行时它有id 3
id 3
,但我已经手动添加了。duplicate key value violates unique constraint
Employee Entity
再次运行,因为它试图在id 4
下保存另一条可用的记录。G 224
那么如何确保Employee Entity
检查数据库中的最后一个id,然后用增量id
保存下一个记录
谢谢
发布于 2021-07-01 16:23:24
在TypeORM中,装饰符@PrimaryGeneratedColumn()
创建一个主列,该列将使用序列生成值。每次在数据库中添加新记录时,它都会使用该列设置的序列的nextval
。假设您正在使用PostgreSQL (我相信对于其他数据库,它将是类似的),那么您有一个Employee表
CREATE TABLE public.Employee (
number serial NOT NULL,
nane varchar NULL
);
因为装饰器@PrimaryGeneratedColumn()
,也会创建一个序列employee_id_seq
。您可以通过运行
select last_value from employee_id_seq;
当应用程序创建两个记录时,它将使用序列生成新的ids,从而更改employee_id_seq
last_value
值。使用数据库中的两条记录,新的last_value将被更新为2。
如果您创建第三条记录,手动传递id =3
INSERT INTO public.Employee (id, name) VALUES(3, 'new_name')
该序列将不被使用,其last_value为2。下次应用程序尝试插入一个新记录时,它将执行插入而不传递id,因为它依赖于序列来生成值,如下所示
INSERT INTO public.Employee (name) VALUES('another_name');
或者(不确定TypeORM如何准确地处理它)
INSERT INTO public.Employee (id, name) VALUES(nextval('employee_id_seq', 'another_name')
上面的SQL将使用序列中的last_value
并添加1,从而生成3和duplicate key violation
。因此,如果手动添加记录不需要手动设置id,则可以运行
INSERT INTO public.Employee (name) VALUES('name')
使用序列自动生成id。
发布于 2022-02-03 15:16:52
在我的例子中,我错误地定义了一种关系。本来应该是@ManyToOne
,但我有@OneToOne
。这是有意义的,因为OneToOne应该对每个实体都有一个实例,因此序列生成器为每个尝试的插入提供相同的id,这会导致错误,因为它对于后续的保存并不是唯一的。我认为TypeORM应该给出不同的错误信息,花了我两天的时间才弄明白。
https://stackoverflow.com/questions/68037334
复制相似问题