Supabase 数据库实战:解决自增主键和CSV导入问题

423 阅读3分钟

在使用Supabase作为后端数据库服务的过程中,我们经常会遇到一些意想不到的挑战。

本文将分享一些在实际操作中遇到的问题及其解决方案,帮助你在Supabase数据库的使用上更加得心应手。

项目背景

在二次开发一个名为BMM的开源项目时,我们最初选择了PostgreSQL数据库作为数据存储方案。

选择了Supabase的免费额度进行开发,由于之前就有一部分json数据,通过nodejs脚本自定义生成csv,然后导入Supabase,高效的完成数据导入~

数据迁移中的挑战

在迁移过程中,我们遇到了两个主要问题:主键冲突数据格式不匹配

主键冲突问题

由于本地数据库已有数据,直接迁移到Supabase时,我们遇到了主键重复的问题。这是因为Supabase的自增序列没有正确地继承本地数据库的当前最大ID值。

报错信息

duplicate key value violates unique constraint \"publicBookmarks_pkey\"

报错信息解读

这个错误信息来自于 PostgreSQL 数据库,它表明你尝试插入或更新的数据违反了表 publicBookmarks 的唯一性约束 publicBookmarks_pkey

具体来说,duplicate key value 意味着你尝试插入的数据中的某个键值在数据库中已经存在。在关系型数据库中,每个表都有一个主键(pkey 是 primary key 的缩写),主键的值必须是唯一的,不能有重复。当你尝试插入一个新记录,或者更新一个已存在的记录,如果新值的主键与表中现有的任何其他记录的主键相同,就会触发这个错误。

例如,如果你有一个 id 字段作为主键,你尝试插入或更新一条记录,使得 id 字段的值与表中另一条记录的 id 字段值相同,就会收到这个错误。

要解决这个问题,你需要确保:

  1. 插入或更新的数据的主键值在表中是唯一的。
  2. 如果你是在进行更新操作,确保没有其他记录的主键值与你要更新的值相同。
  3. 如果这个错误是在批量插入数据时发生的,检查数据源是否有重复的主键值,并在插入前进行清理。

解决方案

首先,先查询当前主键id是多少

SELECT
  MAX(id) AS f
FROM
  public."publicBookmarks";

image.png

我们通过查询pg_get_serial_sequence找到了对应的序列名称,并使用ALTER SEQUENCE语句重置序列的起始值。例如,如果我们的表名为publicBookmarks,序列名为publicBookmarks_id_seq,我们执行了如下操作:

alter sequence "publicBookmarks_id_seq" restart
with
  136;

这确保了新的记录将从正确的ID值开始插入,避免了主键冲突的问题。

结语

在Supabase的实战中,我们学到了宝贵的一课:数据库迁移不仅仅是数据的转移,更是对数据一致性和完整性的挑战。通过不断尝试和优化,我们找到了解决这些问题的有效方法。希望这些经验能够帮助你在Supabase的使用过程中避免类似的陷阱,让你的项目更加顺利地进行。