여러 필드가 있는 TypeORM 고유 인덱스
5828 단어 databasetypescriptprogrammingsql
복잡성은 이러한 필드 중 하나가 다른 테이블에 대한 관계이고 이를 구현하는 방법을 잘 모르겠습니다.
컨텍스트를 좀 더 제공하기 위해 다음 예제를 살펴보겠습니다.
학생으로 구성된 학교 수업이 있고 수업에 같은 이름을 가진 두 명의 학생이 있는 상황을 피하고 싶다고 가정해 보겠습니다(두 학생이 테이블에 나타날 수 있지만 다른 수업에 있는 경우에만).
Class (1) => Student (N)
암호
일반적으로 테이블에서 고유성을 달성하려면
UNIQUE
키워드를 사용하여 TypeORM(및 일반 SQL에서도)에서 고유성을 달성할 수 있습니다. TypeORM에서 우리는 @Unique(param)
데코레이터를 사용하고 고유하게 만들고 싶은 필드의 이름을 매개변수로 전달합니다(예: @Unique('name')
).그러나 우리의 경우에는 다른 SQL 키워드와 TypeORM 데코레이터를 사용해야 합니다.
학생 엔터티를 살펴보겠습니다.
import {
Entity,
Column,
PrimaryGeneratedColumn,
ManyToOne,
} from 'typeorm';
import { SchoolClass } from '../school-class.entity';
@Entity()
export class StudentEntity {
@PrimaryGeneratedColumn()
id: number;
@ManyToOne(() => SchoolClass, (schoolClass) => schoolClass.students)
schoolClass: SchoolClass;
@Column()
name: string;
}
테이블에는 세 개의 열이 있습니다.
id
특정 레코드의 고유 ID입니다. 클래스 테이블
schoolClass
name
학생의 이름입니다. 학교 수업에서 고유한 이름으로 문제를 해결하기 위해
@Index
데코레이터를 사용합니다(그런 다음 SQL에서 INDEX
로 변환됨).import {
Entity,
Column,
PrimaryGeneratedColumn,
ManyToOne,
Index,
} from 'typeorm';
import { SchoolClass } from '../school-class.entity';
@Entity()
@Index(['name', 'schoolClass'], { unique: true }) // Here
export class StudentEntity {
@PrimaryGeneratedColumn()
id: number;
@ManyToOne(() => SchoolClass, (schoolClass) => schoolClass.students)
schoolClass: SchoolClass;
@Column()
name: string;
}
사용하려는 값을 배열로 전달합니다(이 경우
name
및 schoolClass
). 또한 unique
속성이 true
로 설정된 옵션 개체를 전달하고 있습니다. 이렇게 하면 학교 수업에서 같은 이름으로 데이터베이스에 새 레코드를 삽입하면 DUPLICATE_ENTRY
오류가 발생합니다.요약
잘 했어! 새 데이터를 데이터베이스에 삽입하기 위한 고유한 규칙을 만드는 방법을 배웠습니다. 최근에 겪었던 유사한 문제를 해결하는 데 도움이 되기를 바랍니다. :)
Reference
이 문제에 관하여(여러 필드가 있는 TypeORM 고유 인덱스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jacobandrewsky/typeorm-unique-indices-with-multiple-fields-38bb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)