📜  重复键值违反唯一约束“django_migrations_pkey” (1)

📅  最后修改于: 2023-12-03 15:28:31.804000             🧑  作者: Mango

重复键值违反唯一约束“django_migrations_pkey”

介绍

在Django中,当我们执行数据库迁移命令时,如果有两个或多个迁移文件具有相同的名称,就会出现“重复键值违反唯一约束”错误。这是由于Django使用PostgreSQL数据库并为其创建了名为“django_migrations”的表。

在该表中,每个记录表示一个执行迁移的时间戳及其名称。如果两个或多个迁移使用相同的时间戳和名称,就会违反唯一约束并引发错误。此错误可能会导致新的迁移无法应用,因为数据库认为该迁移已经应用,即使它实际上尚未应用。

解决方案

为了解决此错误,可以尝试以下解决方案:

  1. 更改迁移文件的名称和时间戳。
    • 通过更改迁移文件的名称和时间戳来确保每个迁移都具有唯一的标识符。
  2. 删除重复的记录。
    • 可以手动删除表中重复的记录,然后重新应用迁移命令。
DELETE FROM django_migrations WHERE id IN (
  SELECT id FROM (
     SELECT id, ROW_NUMBER() OVER (partition BY app, name ORDER BY id) AS rnum
     FROM django_migrations
  ) t WHERE t.rnum > 1
);
  • 使用此SQL命令可以删除表中所有重复记录,然后再次执行迁移命令即可。需注意备份重要数据。
结论

“重复键值违反唯一约束”错误是Django迁移时常见的错误之一,而出现此错误的原因是两个或多个迁移文件拥有相同的名字和时间戳。要解决此错误,可以更改迁移文件的名称和时间戳,也可以手动删除重复的记录。