最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

如何修改PostgreSQL中一个表的oid

来源:动视网 责编:小采 时间:2020-11-09 11:47:50
文档

如何修改PostgreSQL中一个表的oid

如何修改PostgreSQL中一个表的oid:oid是一个系统的隐藏列。直接修改是不行的。mysql=# update pg_class set oid = 99999 where oid=73728;ERROR: cannot assign t oid是一个系统的隐藏列。直接修改是不行的。mysql=# update pg_class set oid = 9999
推荐度:
导读如何修改PostgreSQL中一个表的oid:oid是一个系统的隐藏列。直接修改是不行的。mysql=# update pg_class set oid = 99999 where oid=73728;ERROR: cannot assign t oid是一个系统的隐藏列。直接修改是不行的。mysql=# update pg_class set oid = 9999


oid是一个系统的隐藏列。直接修改是不行的。mysql=# update pg_class set oid = 99999 where oid=73728;ERROR: cannot assign t

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:oid是一个系统的隐藏列。直接修改是不行的。mysql=# update pg_class set oid = 99999 where oid=73728;ERROR: cannot assign t oid是一个系统的隐藏列。直接修改是不行的。mysql=# update pg_class set oid = 9999
推荐度:
标签: 更改 修改 有一个
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top