修改自动生成的序列

19 浏览
0 Comments

修改自动生成的序列

我使用这个来创建自动递增的id列:

  id  BIGSERIAL                                -- psql
  id  BIGINT GENERATED BY DEFAULT AS IDENTITY  -- hsql

现在在单元测试中,我想在测试之间重置这些序列。

这个可能吗? 我的目标是PostgreSQL和HSQLDB。

0
0 Comments

问题的原因是在使用TRUNCATE语句时,如果被引用的表通过外键与另一个表相连,则在不同的数据库系统中可能会有不同的行为。在PostgreSQL中,TRUNCATE语句会根据设置的偏好级别,要么级联删除记录,要么失败。而在HSQL中的行为可能不同。

解决方法是根据具体的需求和数据库系统的差异进行调整。如果需要级联删除记录,可以在TRUNCATE语句后面加上CASCADE关键字。如果不希望级联删除,可以使用DELETE语句来替代TRUNCATE语句。

以下是解决方法的示例代码:

在PostgreSQL中使用TRUNCATE语句并级联删除记录:

TRUNCATE table_name CASCADE;

在PostgreSQL中使用TRUNCATE语句并禁用级联删除:

TRUNCATE table_name;

在HSQL中使用DELETE语句来替代TRUNCATE语句:

DELETE FROM table_name;

需要注意的是,根据具体的数据库系统和表之间的关系,可能还需要进行其他的调整和处理。所以在使用TRUNCATE语句时,最好先查阅相关数据库系统的文档,了解其具体的行为和限制。

0
0 Comments

问题的出现的原因是当手动插入或删除行后,序列的值不再与表中的最高值匹配。解决方法是使用pg_get_serial_sequence函数来发现用于维护自增的底层序列的名称,然后使用setval函数来操作它,使序列与表中的最高值匹配。

在PostgreSQL中,可以使用pg_get_serial_sequence函数来发现用于维护自增的底层序列的名称,然后使用setval函数来操作它,例如在手动插入或删除行后使序列与表中的最高值匹配:

Select setval(
    pg_get_serial_sequence('table_name', 'column_name'),
    (Select Max(column_name) From table_name),
    TRUE
);

其中的"true"是可选的(默认行为),它告诉序列该值已被使用,并在提供下一个值之前递增。在空表中,您希望下一个值为1,但0超出范围,因此您需要传递FALSE:

 Select setval(pg_get_serial_sequence('table_name', 'column_name'), 1, FALSE);

请注意,仅重置序列而不清除记录将很快导致已存在的键的问题。因此,第一个示例非常适用于在手动“处理”表中的某些数据后将序列设置正确,但不适用于清空表。

0