【问题标题】:Postgresql update sequence after importing data from csv从 csv 导入数据后的 Postgresql 更新序列
【发布时间】:2021-02-16 14:32:22
【问题描述】:

我有一个包含 10 个表的数据库,我在 pgAdmin4(symfony 后端)上使用 Postgresql db,我从 10 个不同的 csv 文件中导入了数据,在每个数据文件中我添加了一个 ID 列来设置它们的值有外键的唯一事实,让我们说 TABLE1 是 TABLE_2 中的外键,TABLE_2_ID 是 TABLE_3 中的外键,TABLE_3_ID 是 TABLE_C 中的外键等......它一直这样持续到最后一张表。

csv 文件的数据导入工作正常。我可以在前端显示我的数据。 现在我正在尝试通过平台用户界面将新数据插入任何表中,我收到了一个约束错误:

SQLSTATE[23505]:唯一违规:7 错误:重复键值违反唯一约束“theme_pkey”详细信息:键 (id)=(4) 已存在。”

假设我正在尝试在 Table_2 中创建一个新值,Doctrine orm 将启动一个错误,表明 id_key 已经存在,看起来我的数据库没有按照我拥有的当前数据进行自我更新已经在数据库中,就像 ID 没有增加一样。

我环顾四周,当您从外部源导入数据库时​​,这似乎很常见,但无法找到可以让我摆脱此错误消息并继续开发的东西。我查看了他们都在谈论更新顺序的所有内容,但似乎没有什么适合我的问题。

【问题讨论】:

  • SELECT max(the_seq_fld) 然后ALTER SEQUENCE the_seq RESTART max_val + 1
  • SELECT setval(pg_get_serial_sequence('table', 'id column'), COALESCE(MAX(id Column), 0)+1 , false) FROM User 我遇到错误:ERROR: syntax error at or near "column" @AdrianKlaver
  • @AdrianKlaver 我收到了ERROR: MINVALUE (1) must be less than MAXVALUE (1)
  • 在这里为我工作。您将需要使用真实的表名和列名显示实际的工作示例。我怀疑它与不引用id Column 有关。空白是问题所在。

标签: sql postgresql doctrine-orm doctrine pgadmin-4


【解决方案1】:

在使用 PGAdmin4 将我的数据从 csv 文件导入我的 postrgresql 数据库后,数据已成功导入,查询以查看数据是否有效并且每一行都有一个 id,在我看来一切都很好,直到我尝试插入我的数据库是一个新对象,但似乎我的数据库卡在Primary_Key id 1 中,它没有考虑到导入的数据库以及它在表上显示一个带有Id 的对象的事实1. 我不完全理解发生了什么,因为我不是 sql 方面的专家,适用于它的约定和限制,我知道足以解决使用 ORM 的问题。

经过数小时的研究和文档阅读后,我得出结论,存在一个名为 Sequence 的东西,并且每个表都有自己的序列,例如 tableAtableB 有一个 tableA_id_seq 和一个 @987654327 @。 我所要做的就是从我的表中获取最大 id / 获取下一个 Id 并简单地增加下一个 Id。

---从我的目标表中获取最大值 ID

SELECT MAX(id) FROM table;

--- 从目标表中获取下一个 ID 值

选择下一个 ID

SELECT NEXTVAL('table_id_seq');

假设我的表中的最大 id 值为 90,所以理论上我的下一个值应该是 91,但是当我启动第二个脚本时,下一个值是 1,

所以我必须根据我的最大值 + 1 设置下一个值

---- 设置跟随我的最大值的下一个值

SELECT setval('table_id_seq', (SELECT MAX(id) FROM table)+1)

希望这对遇到类似问题的下一个人有所帮助。

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    相关资源
    最近更新 更多