从 csv 导入数据后的 Postgresql 更新序列
Postgresql update sequence after importing data from csv
我有一个包含 10 个 table 的数据库,我在 pgAdmin4(symfony 后端)上使用 Postgresql 数据库,我从 10 个不同的 csv 文件导入数据,在每个数据文件中我添加了一个ID 列为存在外键的单一事实设置它们的值,假设 TABLE1 是 TABLE_2 中的外键,TABLE_2_ID 是 TABLE_3 中的外键,TABLE_3_ID 是 TABLE_C 等中的外键...这样一直持续到最后一个 table.
csv 文件的数据导入有效。我可以在前端显示我的数据。
现在,我正尝试通过平台用户界面将新数据插入任何 table 中,但出现约束错误:
SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates unique constraint "theme_pkey" DETAIL: Key (id)=(4) already exists."
假设我正在尝试在 Table_2 中创建一个新值,Doctrine orm 将启动一个错误,表明 id_key 已经存在,好像我的数据库没有' t 按照我在数据库中已有的当前数据更新自身,就像 ID 没有递增一样。
我环顾四周,当您从外部来源导入数据库时,这似乎很常见,但无法设法找到可以让我摆脱此错误消息并继续我的开发的东西。我查看了所有关于更新顺序的内容,但似乎没有任何内容符合我的问题。
使用 PGAdmin4 将我的数据从 csv 文件导入到我的 postrgresql 数据库后,数据已成功导入,查询以查看数据是否有效并且每一行都有一个 ID,在我看来一切都很好直到我尝试向我的数据库中插入一个新对象,但似乎我的数据库卡在 Primary_Key id
1 中,它没有考虑导入的数据库以及它显示在 table 一个 Id
为 1 的对象。我不完全理解发生了什么,因为我不是 sql 的专家,适用于它的约定和限制,我知道如何使用 ORM 解决问题。
经过数小时的研究和阅读文档后我得出结论,存在一个名为 Sequence
的东西,并且每个 table 都有自己的序列,例如 tableA
和 tableB
有一个 tableA_id_seq
和一个 tableB_id_seq
。
我所要做的就是从我的 table 中获取最大 ID / 获取下一个 ID 并简单地增加下一个 ID。
---从我的目标中获取最大值 ID TABLE
SELECT MAX(id) FROM table;
--- 从目标中获取下一个 ID 值 TABLE
SELECT 下一个 ID
SELECT NEXTVAL('table_id_seq');
假设我的 table 的最大 ID 值为 90,所以理论上我的下一个值应该是 91,但是当我启动第二个脚本时,下一个值是 1,
所以我不得不根据我的最大值 + 1 设置下一个值
---- 设置下一个跟随我的最大值的值
SELECT setval('table_id_seq', (SELECT MAX(id) FROM table)+1)
希望这能帮助下一个遇到类似问题的人。
我有一个包含 10 个 table 的数据库,我在 pgAdmin4(symfony 后端)上使用 Postgresql 数据库,我从 10 个不同的 csv 文件导入数据,在每个数据文件中我添加了一个ID 列为存在外键的单一事实设置它们的值,假设 TABLE1 是 TABLE_2 中的外键,TABLE_2_ID 是 TABLE_3 中的外键,TABLE_3_ID 是 TABLE_C 等中的外键...这样一直持续到最后一个 table.
csv 文件的数据导入有效。我可以在前端显示我的数据。 现在,我正尝试通过平台用户界面将新数据插入任何 table 中,但出现约束错误:
SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates unique constraint "theme_pkey" DETAIL: Key (id)=(4) already exists."
假设我正在尝试在 Table_2 中创建一个新值,Doctrine orm 将启动一个错误,表明 id_key 已经存在,好像我的数据库没有' t 按照我在数据库中已有的当前数据更新自身,就像 ID 没有递增一样。
我环顾四周,当您从外部来源导入数据库时,这似乎很常见,但无法设法找到可以让我摆脱此错误消息并继续我的开发的东西。我查看了所有关于更新顺序的内容,但似乎没有任何内容符合我的问题。
使用 PGAdmin4 将我的数据从 csv 文件导入到我的 postrgresql 数据库后,数据已成功导入,查询以查看数据是否有效并且每一行都有一个 ID,在我看来一切都很好直到我尝试向我的数据库中插入一个新对象,但似乎我的数据库卡在 Primary_Key id
1 中,它没有考虑导入的数据库以及它显示在 table 一个 Id
为 1 的对象。我不完全理解发生了什么,因为我不是 sql 的专家,适用于它的约定和限制,我知道如何使用 ORM 解决问题。
经过数小时的研究和阅读文档后我得出结论,存在一个名为 Sequence
的东西,并且每个 table 都有自己的序列,例如 tableA
和 tableB
有一个 tableA_id_seq
和一个 tableB_id_seq
。
我所要做的就是从我的 table 中获取最大 ID / 获取下一个 ID 并简单地增加下一个 ID。
---从我的目标中获取最大值 ID TABLE
SELECT MAX(id) FROM table;
--- 从目标中获取下一个 ID 值 TABLE
SELECT 下一个 ID
SELECT NEXTVAL('table_id_seq');
假设我的 table 的最大 ID 值为 90,所以理论上我的下一个值应该是 91,但是当我启动第二个脚本时,下一个值是 1,
所以我不得不根据我的最大值 + 1 设置下一个值
---- 设置下一个跟随我的最大值的值
SELECT setval('table_id_seq', (SELECT MAX(id) FROM table)+1)
希望这能帮助下一个遇到类似问题的人。