当前位置: 首页 > 知识库问答 >
问题:

TypeForm:更改主键长度后出现重复输入错误

武彭薄
2023-03-14

我正在用Nestjs、MySQL和Typeorm制作一个电子邮件表。我有字符类型的主键长度为39,并把一个独特的字符串组成的UUID连接与一些额外的刺。下面是我在名为“电子邮件”的Nestjs实体文件中使用Typeorm制作主键的方法。其中没有@PrimaryColiv或@PrimaryGeneratedColiv。

@Column({
  primary: true,
  type: 'char',
  length: 39,
})
id: string;

表中有一些数据。在我将长度从39改为45并运行服务器后,TypeOrmMoules发生了错误。我没有试图挽救任何东西。奇怪的是,我在通过谷歌插入数据时看到过类似的错误。

QueryFailedError: Duplicate entry '' for key 'email.PRIMARY'

即使我将长度设置为39,仍然会发生错误。我发现运行服务器的唯一方法是删除表并创建一个新表。

关于这个错误,我有两个问题。

  1. 是否有改变主键长度,将数据保留在表中,并运行服务器的解决方案?
  2. "-错误语句中的空字符串-如何影响主键的唯一性?

共有1个答案

张德佑
2023-03-14

我猜在Typeorm配置对象中有synchronize:true。并基于打字文档

指示是否应在每次应用程序启动时自动创建数据库架构。小心使用此选项,不要在生产中使用此选项,否则可能会丢失生产数据。

因此,实际发生的情况是,当您更改列的长度并启动应用程序时,typeorm会尝试同步此更改并更新模式。出于这里提到的原因,Typeorm通过完全删除列并创建一个新的列来实现这一点,在这里它遇到了重复错误。

>

  • 对于第一个问题,您可以使用迁移来更好地控制模式的更新方式。虽然我应该提到,在迁移过程中,typeorm的行为类似,并删除了用于更改的列,但至少您可以自己编辑迁移文件,以确保它执行您希望它执行的操作。也可以直接编辑数据库的模式。无论您选择做什么,同步可能永远都不是一个好主意,除非是在开发的早期阶段。

    作为您的第二个问题,由于您的主列是一个没有默认值的char,因此对于不可为空的字段,新列值将以'noramally作为char的默认值填充;但是很明显,它在一个主列上遇到了一个重复的错误,在这个主列中唯一性也是最重要的;因此出现错误密钥电子邮件的重复条目“”。主“

  •  类似资料:
    • 好的,所以我不确定这是否可能,但我需要更改一个表中的主键值,以匹配另一个表中的FK值。 我创建了一个表-POS_Transactions(FK REGISTER)并导入了它的值,然后创建了另一个表-Registers(pk Registers key)并导入了它的值。但是当我导入寄存器的值时,我遇到了一些问题,必须清除表并再次尝试多次(这就是为什么数字是从15到22的原因,它只是以这种方式自动更新

    • 我不知道为什么这不起作用 单击该按钮显然会更改道具,但旧的仍在输入中!那么什么给了?我做错了什么?这是虫子吗?有变通办法吗?

    • 问题内容: 我试图将我的SQL数据库中表的主键从现有键更改为复合键,其中不包括现有列。由于出现以下错误消息,因此以下代码无法正常工作: 删除主键: PRIMARY附近的语法不正确。预期为COLUMN,CONSTRAINT,ID或QUOTED_ID 添加主键: PRIMARY附近的语法不正确。 期望ID T-SQL代码: 编辑 我可以通过使用以下两个查询语句来完成此操作 我没有要求SQL“ DROP

    • 我对SQL和MySQL非常陌生。我试图修改表中的主键列,使其自动递增。这个主键也是另一个表中的外键。由于与另一个表中的外键相关的错误,我无法修改此列。以下是错误: 我确信这很简单,但我不知道为什么,我关注的书也没有说明原因。谢谢。

    • 我正在尝试用Angular构建一个简单的计算器,如果我想的话,我可以覆盖总数。我有这部分的工作,但当我回去输入一个数字在一个或两个领域的总数没有在该领域的更新。 这是我的jsfiddlehttp://jsfiddle.net/YUza7/2/ 形式 javascript

    • 在这里,是主列键中的第三列。我想要做到这一点的唯一方法是将主复合键更改为。我找不到任何文档告诉我如何做到这一点。有可能吗? 或者,我是否错过了解决这个问题的“正确”方法/我是否曲解了这个问题?