如何修改postgresql中一個表的oid

來源:互聯網
上載者:User

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開始了,避免了剛剛那個問題。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.