TypeORM:更改主键长度后重复输入错误

TypeORM: duplicate entry error after changing length of primary key

我正在使用 Nestjs、MySQL 和 Typeorm 为电子邮件制作 table。我的 char 类型主键长度为 39,并放置了一个由 UUID 连接组成的唯一字符串,其中包含一些额外的字符串。 这是我在名为 'email' 的 Nestjs 实体文件中使用 Typeorm 创建主键的方法。里面没有@PrimaryColumn或者@PrimaryGeneratedColumn。

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

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

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

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

关于这个错误我有 2 个问题。

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

我猜你的 Typeorm 配置对象中有 synchronize: true。 并基于 Typeorm documents

Indicates if database schema should be auto created on every application launch. Be careful with this option and don't use this in production - otherwise you can lose production data.

所以实际发生的是,当您更改列的长度并启动您的应用程序时,typeorm 会尝试同步此更改并更新您的架构。由于提到的原因 here,Typeorm 通过完全删除该列并创建一个新列来做到这一点,它遇到了重复错误。

  1. 对于第一个问题,您可以使用 migrations 来更好地控制架构的更新方式。虽然我应该提到在迁移中 typeorm 的行为类似并删除更改的列,但至少你可以自己编辑迁移文件以确保它按照你想要的方式执行。或者您可以直接编辑数据库的架构。无论您选择做什么,synchronize 可能都不是一个好主意,除了非常早期的开发阶段。

  2. 作为您的第二个问题,由于您的主列是 char,没有默认值,因此新列值将正常填充 '',默认为 char 对于不可为空的字段;但显然它在唯一性也是最多的主列上遇到重复错误;因此错误 Duplicate entry '' for key 'email.PRIMARY'