![]() |
1
610
|
![]() |
2
177
或者更简明扼要地说:
但是,此表单无法正确处理空表,因为max(id)为空,并且也不能设置val 0,因为它将超出序列的范围。解决这个问题的一个方法是
但是
似乎最好的万能解决方案是
这会勾选我所有的框:
最后,请注意
即如果
但如果手动添加序列:
|
![]() |
3
57
这个 最短最快 方式:
如果您不知道附加序列的名称(不必使用默认格式),请使用
这里没有一个错误。 Per documentation:
大胆强调我的。 并发性在上述查询中,还没有针对并发序列活动或对表进行写操作的防御。如果相关的话,你可以 锁桌子 在独占模式下。它可以防止并发事务在您尝试同步时写入更高的数字。(它还临时阻止无害的写入,而不会干扰最大数目。) 但是它并没有考虑到那些在主表上没有任何锁的情况下提前获取序列号的客户机(可能会发生这种情况)。考虑到这一点,只有 增加 序列的当前值,永远不要减小它。它可能看起来有点偏执,但这与序列的性质一致,并且可以抵御并发性问题。
|
![]() |
4
48
这将从public重置所有序列,对表名或列名不做任何假设。在8.4版上测试
|
![]() |
5
36
从@tardate answer复制:
|
![]() |
6
18
此命令仅用于更改PostgreSQL中自动生成的键序列值
在零的位置,您可以放置任何想要从中重新启动序列的数字。
默认序列名将
这与@murugesanponappan的答案相同,但他的解决方案中存在语法错误。不能使用子查询
|
![]() |
7
16
重置所有序列,除每个表的主键为“id”外,不假设名称:
|
![]() |
8
12
当序列名、列名、表名或模式名具有有趣的字符(如空格、标点符号等)时,这些函数充满了危险。我写的是:
您可以通过向它传递OID来为单个序列调用它,它将返回默认序列的任何表所使用的最高数字;也可以使用类似这样的查询来运行它,以重置数据库中的所有序列:
使用不同的限定符,您只能重置特定模式中的序列,依此类推。例如,如果要调整“public”模式中的序列:
注意,由于setval()的工作方式,您不需要向结果中添加1。 作为结束语,我必须警告一些数据库似乎有默认链接到序列的方式,这些方式不允许系统目录拥有它们的完整信息。当您在psql的\d中看到类似的情况时,就会发生这种情况:
请注意,该默认子句中的nextval()调用除了::regclass cast之外还有一个::text cast。我 认为 这是因为数据库是从旧的PostgreSQL版本中转储的。会发生的是,上面的函数序列_Max_Value()将忽略这样的表。要解决此问题,可以重新定义default子句以直接引用序列,而不使用强制转换:
然后psql正确显示:
一旦您修复了这个问题,这个函数就可以正确地为这个表以及所有可能使用相同序列的其他表工作。 |
![]() |
9
6
从公共位置重置所有序列
|
![]() |
10
6
这里有一些真正的核心答案,我假设在被问到这个问题的时候它曾经是非常糟糕的,因为这里的许多答案在9.3版中不起作用。这个 documentation 因为8.0版提供了这个问题的答案:
另外,如果您需要处理区分大小写的序列名,则可以这样做:
|
![]() |
11
5
我的版本使用第一个版本,并进行了一些错误检查…
|
![]() |
12
5
把它们放在一起
将修复
|
![]() |
13
5
我建议在Postgreswiki上找到这个解决方案。它会更新表的所有序列。
如何使用(来自Postgres wiki):
例子:
原始物品(也带有序列所有权固定) here |
![]() |
14
5
还有另一个plpgsql-只在
同时评论该行
|
![]() |
15
4
在我还没有尝试代码之前:在下面我发布 Klaus和User457226解决方案的SQL代码版本 它在我的电脑上工作[Postgres8.3],只有一些小附件 对于克劳斯一号和我的版本,对于用户457226一号。 克劳斯解决方案:
用户457226解决方案:
|
![]() |
16
4
重新检查公共模式函数中的所有序列
|
![]() |
17
4
当使用实体框架创建数据库,然后用初始数据为数据库种子时,我会遇到这个问题,这会使序列不匹配。 我通过创建一个脚本来解决这个问题,该脚本在创建数据库之后运行:
|
![]() |
18
3
要将所有序列重新启动为1,请使用:
|
![]() |
19
2
如果在加载自定义SQL数据进行初始化时看到此错误,则另一种避免此错误的方法是: 不是写:
移除
这使Postgres序列保持同步! |
![]() |
20
2
这个答案是毛罗的副本。
|
![]() |
21
2
我花了一个小时试图得到djsnowsill对使用混合大小写表和列的数据库的回答,最后在Manuel Darveau的评论下偶然发现了解决方案,但我认为我可以让每个人都更清楚一点:
这有以下好处:
解释一下,问题是
这是通过使用
|
![]() |
22
1
克劳斯的回答是最有用的,对一个小小的小姐来说是:你 必须在select语句中添加distinct。 但是,如果您确定没有表+列名可以等效 对于两个不同的表,还可以使用:
这是用户457226解决方案在以下情况下的扩展: 某些感兴趣的列名不是“id”。 |
![]() |
23
1
丑陋的黑客使用一些外壳魔法来修复它,这不是一个很好的解决方案,但可能会激发其他人的类似问题:)
|
![]() |
25
0
|
![]() |
dave paola · 在Postgres中包含架构信息的主键 7 年前 |
![]() |
Anand Tripathi · 正确选择UUID作为主键的数据类型 7 年前 |
![]() |
Palisand · 在复合主键中使用时未创建MySQL外键 7 年前 |
![]() |
Holf · 我应该将主键拆分为分区键和行键组件吗? 7 年前 |
![]() |
user979974 · php mysql更新表选项列表框 7 年前 |