oID是一个系统的隐藏列。直接修改是不行的。
MysqL=# update pg_class set oID = 99999 where oID=73728;
ERROR: cannot assign to system column "oID"
liNE 1: update pg_class set oID = 99999 where oID=73728;
但是我们可以将其删除
MysqL=# delete from pg_class where oID=73728;
DELETE 1
在postgresql中有一个copy命令,有一个参数 with oIDs,可以将oID一起导入,利用这个特性,我们可以达到oID的修改功能。
1.首先新建一个文件,将数据放入,新的oID已修改
[MysqL@pttest4 cxf]$ cat 2.dat
73740|test|2200|73729|10|0|73740|0|0|0|0|0|f|f|r|1|0|0|0|0|0|f|f|f|f|814|/N|/N
2.使用copy命令导入数据
copy pg_class from '/home/MysqL/cxf/2.dat' null as E'//N' csv delimiter '|' oIDs;
3.修改其他表中的对应oID数据
update pg_attribute set attrelID ='73740' where attrelID ='73728';
update pg_depend set refobjID='73740' where refobjID ='73728';
update pg_type set typrelID ='73740' where typrelID = '73728';
ps:如果还涉及其他的数据字典,应一并修改掉
4.查询,可以看出oID已变更
MysqL=# select * from test;
ERROR: Could not open relation 1663/16386/73740: No such file or directory
MysqL=# select oID from pg_class where relname ='test';
oID
-------
73740
(1 row)
5.将数据文件更名为新的oID
[MysqL@pttest4 16386]$ mv 73728 73740
再查数据库,原有的那条数据还是可以访问到的。
MysqL=# select * from test;
a
---
1
(1 row)
至此,oID修改成功。
修改oID引发的其他问题。由于当前系统的oID是73735,而我们变更的oID(73740)在这个之后,接着我们创建表的时候这个oID还会重用,这样有可能会造成oID错乱。如下
MysqL=# create table helloworld(b varchar(1));
CREATE table
MysqL=# select oID from pg_class where relname='helloworld';
oID
-------
73735
(1 row)
MysqL=# create table helloworld1(b varchar(1));
CREATE table
MysqL=# create table helloworld2(b varchar(1));
CREATE table
MysqL=# create table helloworld3(b varchar(1));
CREATE table
MysqL=# select oID from pg_class where relname like 'helloworld%';
oID
-------
73735
73737
73739
73741
(4 rows)
MysqL=# select * from pg_type where oID = '73740';
typname | typnamespace | typowner | typlen | typbyval | typtype | typisdefined | typdelim | typrelID | typelem | typinput | typoutput | typreceive | typsend | typanalyze | typalign | typstorage | typnotnull | typbasetype | typtypmod | typndims | typdefaultbin | typdefault
-------------+--------------+----------+--------+----------+---------+--------------+----------+----------+---------+-----------+------------+-------------+-------------+------------+----------+------------+------------+-------------+-----------+----------+---------------+------------
helloworld2 | 2200 | 10 | -1 | f | c | t |,| 73739 | 0 | record_in | record_out | record_recv | record_send | - | d | x | f | 0 | -1 | 0 | |
(1 row)
可以看到,新的pg_type的oID用到了73740。为了避免这种情况,我们可以用pg_resetxlog重置oID。如:pg_resetxlog -o 80000 ~/postgresql/data/这样子建表的时候oID就重80000开始了,避免了刚刚那个问题。
总结以上是内存溢出为你收集整理的如何修改postgresql中一个表的oid全部内容,希望文章能够帮你解决如何修改postgresql中一个表的oid所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)