When I insert
我正进入(状态integer out of range
因为我的 id/主键被错误地创建为int
代替bigint
or bigserial
。我试过:
ALTER TABLE tbl ALTER COLUMN id TYPE BIGINT;
但我收到以下错误,因为我的可用磁盘空间不够大。
ERROR: could not extend file "base/16401/3275205": No space left on device
HINT: Check free disk space.
SQL state: 53100
我现在无法增加磁盘空间,由于令人沮丧的原因,我不会详细说明。
我还尝试通过执行这些操作来重用 ids(我从该表中删除了很多记录,因此存在很大的间隙)seq
over:
https://dba.stackexchange.com/questions/111823/compacting-a-sequence-in-postgresql https://dba.stackexchange.com/questions/111823/compacting-a-sequence-in-postgresql
但对于该链接中的解决方案#1:我假设我没有磁盘空间。该表有 117GB,我有大约 24GB 可用空间...data/base
。我确实有 150GB 可用空间用于存储我的临时文件(不同的安装),这不是默认配置,但这样做是为了节省数据库存储空间...data/base
。如果我可以在临时文件位置创建表,这可能会起作用,但我不知道该怎么做。
对于该链接中的解决方案#2:当我到达update
部分,我在 pgAdmin4 中得到了这个:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p>
但是,当我运行时查询仍在运行:
select pid,query,state,wait_event,* from pg_stat_activity where state <> 'idle'
我没有得到服务器日志update
失败的查询。
我最终杀死了更新查询,认为它最终会失败。 (我再次运行这个,并让它运行上面的 html 错误,除非其他人有更好的主意。)
对于该链接中的解决方案#3:我有16GM的内存,所以不够用。
接下来从这里开始:如何重置 postgres 中的序列并用新数据填充 id 列? https://stackoverflow.com/questions/4678110/how-to-reset-sequence-in-postgres-and-fill-id-column-with-new-data
我试过这个:
UPDATE table SET id = DEFAULT;
ALTER SEQUENCE seq RESTART;
UPDATE table SET id = DEFAULT;
ERROR: integer out of range
当您尝试插入时,这会创建一个重复的键:
ALTER SEQUENCE seq RESTART WITH 1;
UPDATE t SET idcolumn=nextval('seq');
我还能尝试什么吗?
PostgreSQL 9.6