- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在第一类中,主键是复合的:
@Entity({
name: 'ClassA',
database: Constants.DATABASE_NAME,
})
export class ClassA {
@PrimaryColumn({
name: 'Field1',
type: 'varchar',
length: 4,
})
field1: string;
@PrimaryColumn({
name: 'Field2',
type: 'varchar',
length: 2,
})
field2: string;
@PrimaryColumn({
name: 'Field3',
type: 'integer',
})
field3: number;
@OneToMany(() => ClassB, (classB) => classB.classA)
classB: ClassB[];
}
在另一个类中,第一个类用作外键:
@Entity({
name: 'ClassB',
database: Constants.DATABASE_NAME,
})
export class ClassB {
...
@ManyToOne(() => ClassA, (classA) => classA.classB, {
cascade: true,
})
@JoinColumn([
{ name: 'Field1', referencedColumnName: 'field1' },
{ name: 'Field2', referencedColumnName: 'field2' },
{ name: 'Field3', referencedColumnName: 'field3' },
])
classA: ClassA;
}
当我使用 nest start
启动 NestJS 时,出现错误
code: "ER_FK_NO_INDEX_PARENT"
errno: 1822
sqlMessage: Failed to add the foreign key constraint. Missing index for constraint 'FK_1d19fe001872b5ee9ab545c18f8' in the referenced table 'ClassA'
sqlState: "HY000
尝试修改ClassA表,对主键的每一列加索引,然后对主键的所有列加索引,还是报错。
是否可以使用 TypeORM 来管理这种情况?
相关包:
0.2.41
8.0.0
8.0.3
2.18.1
数据库:Docker 容器中的 MySQL v8.0
(mysql:latest
)
谢谢。
问题似乎是使用 TypeORM 在多个步骤中创建了该表。错误消息后的表格如下所示。
CREATE TABLE `ClassB` (
`Date` datetime NOT NULL,
`ClassAField1` varchar(4) NOT NULL,
`ClassAField2` varchar(2) NOT NULL,
`ClassAField3` int NOT NULL,
PRIMARY KEY (`Date`,`ClassAField1`,`ClassAField2`,`ClassAField3`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
错误发生在以下查询中,其中 TypeORM 尝试添加外键:
ALTER TABLE `ClassB`
ADD CONSTRAINT `FK_479eaf779e0d5f0d0a83bb9e30d`
FOREIGN KEY (`ClassAField1`, `ClassAField2`, `ClassAField3`)
REFERENCES `LandPlots`(`Field1`,`Field2`,`Field3`) ON DELETE NO ACTION ON UPDATE NO ACTION
我做了一些测试,下面的查询按预期工作:
CREATE TABLE `ClassB` (
`Date` datetime NOT NULL,
`ClassAField1` varchar(4) NOT NULL,
`ClassAField2` varchar(2) NOT NULL,
`ClassAField3` int NOT NULL,
PRIMARY KEY (`Date`),
KEY `FK_e6b2926df2c758d8d8810e4345a` (`ClassAField1`, `ClassAField2`, `ClassAField3`),
CONSTRAINT `FK_e6b2926df2c758d8d8810e4345a`
FOREIGN KEY (`ClassAField1`, `ClassAField2`, `ClassAField3`)
REFERENCES `ClassA` (`Field1`, `Field2`, `Field3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
差异似乎是 KEY `FK_e6b2926df2c758d8d8810e4345a` (`ClassAField1`, `ClassAField2`, `ClassAField3`),
行,TypeORM 生成的 SQL 中缺少它。
来自 MySQL documentation ,KEY
语句与 INDEX
同义:
KEY | INDEX
KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY can also be specified as just KEY when given in a column definition. This was implemented for compatibility with other database systems.
所以我尝试将 @Index
装饰器添加到该列,但它没有改变任何东西。我添加了所有已执行查询的日志记录,看起来 @Index
装饰器没有被执行,所以,也许 @JoinColumn
装饰器优先于它? (为了以防万一,尝试对装饰器进行不同的排序)。
我能想到的使用 TypeORM 的唯一解决方案是生成所有 3 个主键的散列或串联,并使其成为唯一的主键。两个缺点:插入前解析实体时的数据重复和 CPU 使用率。
如果有人有更好的建议,我想听听。
更新语句:
UPDATE cb
SET cb.SomeField = 'NewValue'
FROM ClassB cb
JOIN ClassA ca
ON cb.Field1 = ca.Field1
AND cb.Field2 = ca.Field2
AND cb.Field3 = ca.Field3
WHERE ca.SomeOtherField LIKE '%partialvalue%'
AND cb.otherPK = 1
最佳答案
该 UPDATE 可能会受益于其中一些索引:
cb: INDEX(otherPK, Field1, Field2, Field3)
ca: INDEX(Field1, Field2, Field3, SomeOtherField)
关于mysql - TypeORM复合外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70963321/
我知道 typeorm 可以创建整个 db 模式,甚至可以将数据库模式与实体定义同步(请参阅 synchronize 中的 Connection Options ) 但在生产中,我想要求 typeor
我有一个 Role Entity 和一个 Route Entity,它们是树形结构,它们是 ManyToMany 关系。 现在我想通过 RoleRepository.find({relations:
我已经设置了 logging: true当createConnection()来自 TypeORM ,在大多数情况下都可以正常工作。 但是有一种情况,我的数据字段之一来自特定的 query/mutat
在 Rails 上,每个测试用例都会创建一个 ActiveRecord 事务,它允许测试所有内容,然后将数据库恢复到原始状态,而不必删除所有表或任何可能影响播种机等的内容。 可以在 Typeorm 上
Note 与 Subject 具有多对多关系 查询它的最佳方式是什么?我喜欢编写以下内容来获取给定注释上的所有主题: const subjectRepo = connection.getRepos
我使用 UUID 作为我的实体的主键,它工作得很好。但我想删除那些破折号。 现在 ID 被保存为 8e5365f4-3d42-4274-bafc-93b97bd6e3f2 36 个字符 我想要的是 8
我一整天都在尝试将实体保存到 MySQL 数据库中,遇到了巨大的困难。我正在使用 NestJS 和 TypeORM。 teacher.entity.ts import { BeforeInsert,
我也想在前端使用我用 TypeORM 创建的实体。有没有一种干净的方法可以做到这一点?或者我应该继续这样做。 此时,我的文件结构如下所示(前端的 Angular 8): /server /enti
我想得到一个 basic setup使用 TypeORM 工作,并在设置后收到此错误。 这是一个 REPL(只需执行 yarn install && yarn db:dev 后跟 yarn db:mi
我正在尝试通过 Nest/TypeORM 构建 SAAS 产品,我需要按子域配置/更改数据库连接。 customer1.domain.com => connect to customer1 datab
如何将 TypeORM 与 Better-sqlite3 一起使用? 上官方documentation ,有一个section形式更好-sqlite3。 我已经通过 typeorm@latest 安装
操作系统:macOS Sierra v 10.12.6 我正在尝试使用 typeorm 在 Typescript 中构建一个应用程序,这是我第一次使用其中任何一个。 我使用了以下两种方法来安装 typ
有没有一种简单的方法可以使用 DataSource 在 typeORM v.0.3.6 中播种数据? typeorm-seeding 似乎使用已弃用的 Connection。 最佳答案 找到这个包裹
我正在做一门类(class),我们使用 express-node postgres 和 react(使用 typescript)和 typeORM。到目前为止一切都运行良好,但我面临 typeORM
尽管进行了大量研究和反复试验,但不幸的是,我还没有针对以下用例的完美解决方案:一个用户有多个帖子,这被正确地实现为一对多关系。我想为用户加载他的所有帖子,但不是帖子的所有属性,只有某些属性。 方法 1
我用 NestJS 和 ORM TypeORM 做一个 API 我有实体: 用户 关系类型 UserRelationshipType(带有用户和关系类型 ForeignKey) 和关系(与 userR
我有两个实体 Tag 和 Photo: // tag.entity.ts import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm
我有以下要保存的实体: @Entity('approvals') export class Approval { @PrimaryGeneratedColumn() id: string;
我有命令: .leftJoinAndSelect("permission.user", "user") .where("permissi
我是使用 typeorm 的新手,这是我第二次与 typeorm 混淆,我有以下查询: SELECT t1.a,t1.b,t2.a (SELECT TOP 1 t1.a FROM table1
我是一名优秀的程序员,十分优秀!