type
status
date
slug
summary
tags
category
icon
password
在使用supabase数据库时,遇到了由于主键自增设置问题导致的重复键错误。解决方案是找到自增序列的名称,然后重置自增序列的起始值为下一个未使用的值。此外,从本地的postgresql导出的csv文件导入到supabase时,也会出现字段格式不对的问题,需要寻找更好的数据同步方案。
背景
在做那个aiwallpaper壁纸项目中,一直用的本地的postgresql数据库,但是呢,最终还是要上线的嘛,还是给换成了远端的数据库,也就是supabase数据库。
操作步骤
现在说一下踩的坑,我呢,是先把本地的数据库表结构的建表语句复制到了supabase里面,这里可以随手拿一个举例吧。
由于我本地已经创建了16条记录了,然后我导出csv文件,然后将这个csv文件导入到了supabase里面。
这样在supabase的aiwa_wallpapers表里面也就添加了16记录,不过呢,事情并没有结束。
接着就出现问题了。我直接在网站首页触发生成一条新的图片,结果报错了,报错的内容,就是这个数据库错误,提示我出现了重复的key,按照我的理解是,我前面的16条记录虽然添加了,但是呢,并没有修改到这个表的下次生成的主键id的值。
我们打开supabase的aiwa_wallpapers表的结构,可以看到这个东西。
可以看到这个东东
nextval('aiwa_wallpapers_id_seq'::regclass)
按照我们上面的建表语句,在没有设置主键自增的情况下,插入的这些记录,不会更新aiwa_wallpapers_id_seq的值的,也就是执行nextval('aiwa_wallpapers_id_seq'::regclass)
的结果后,值是1,会跟前面插入的16条记录中的第一条记录出现冲突。导致插入失败。出现问题后如何解决呢
以上就是出现的问题,那么问题出现后,我应该如何解决呢,我问了devv.ai 地址是在supabase里面已经手动插入了16条数据,这个时候主键新增,还是从1开始,应该如何解决啊
看关键的脚本代码:
我们执行,
pg_get_serial_sequence('aiwa_wallpapers', 'id');
找到这个sequence后,执行下面的操作ALTER SEQUENCE public.aiwa_wallpapers_id_seq RESTART WITH 17;
这样之后,我们在web端手动插入一条aiwa_wallpapers记录,随便输入test之类的字符,最终点击save,会发现插入成功,生成的新记录id是17,到此问题解决。用supbase数据库也是要不断踩坑的呀。坑坑不息。
结尾
其实还碰到了一个问题,就是从本地的postgresql导出的csv文件导入到supabase里面,也会出现字符串字段等格式不对的地方,很好奇有啥更好的方式,可以同步本地数据到supabase,希望后续可以找到更好的方案。