it技術:データベース:postgresql:oracleからの移行
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
it技術:データベース:postgresql:oracleからの移行 [2021/06/24 23:57] – [データ型] yajuadmin | it技術:データベース:postgresql:oracleからの移行 [2022/12/14 11:23] – [集合演算] yajuadmin | ||
---|---|---|---|
行 6: | 行 6: | ||
^Oracleのデータ型^PostgreSQL^説明^備考^ | ^Oracleのデータ型^PostgreSQL^説明^備考^ | ||
- | |VARCHAR2(n)|CHARACTER VARYING(n)| 最大n文字の長さの文字列| | + | |VARCHAR2(n)|CHARACTER VARYING(n)| 最大n文字の長さの文字列|Oracleはバイト数、PostgreSQLは文字数| |
- | |NUMBER|NUMERIC|最大1000桁、ユーザ指定精度| | + | |NUMBER|NUMERIC|最大1000桁、ユーザ指定精度| | |
|DATE|TIMESTAMP| |DATEのままだと日付のみになる| | |DATE|TIMESTAMP| |DATEのままだと日付のみになる| | ||
|SYSDATE|current_timestamp | |SYSDATE|current_timestamp | ||
- | |ROWID|oid|32bit(約43億)で一周してしまう|Create文でWITH OIDSと設定しないと使用できない、PostgreSQL12ではWITH OIDS廃止| | + | |ROWID|oid|32bit(約43億)で一周してしまう|Create文でWITH OIDSと設定しないと使用できない、PostgreSQL12以降はWITH OIDS廃止| |
参照:[[http:// | 参照:[[http:// | ||
=== 注意点 === | === 注意点 === | ||
+ | OracleはVARCHAR2はバイト数、PostgreSQLはCHARACTER VARYINGは文字数となる。\\ | ||
OracleのNUMBER型をPostgreSQLのNUMERIC型に単純に変更したが、これには弊害もある。\\ | OracleのNUMBER型をPostgreSQLのNUMERIC型に単純に変更したが、これには弊害もある。\\ | ||
整数しか入らないなら、素直にsmallint型やinteger型にする方がいいかも。 | 整数しか入らないなら、素直にsmallint型やinteger型にする方がいいかも。 | ||
行 114: | 行 115: | ||
</ | </ | ||
+ | TABLEを作成するよりVIEWにする方が一般的。\\ | ||
+ | [[https:// | ||
+ | |||
+ | <code sql> | ||
+ | CREATE VIEW dual AS | ||
+ | SELECT ' | ||
+ | </ | ||
行 173: | 行 181: | ||
WHERE MGR_ID IS NOT NULL; | WHERE MGR_ID IS NOT NULL; | ||
</ | </ | ||
+ | ==== DELETE文のFROM句にJOINが使えない ==== | ||
+ | USING句やIN句に変更する。\\ | ||
+ | [[https:// | ||
+ | |||
+ | ==== MERGE文サポート(PostgreSQL 15以降) ==== | ||
+ | PostgreSQL 15でMERGE文がサポートされました。 | ||
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
==== 集合演算 ==== | ==== 集合演算 ==== | ||
UNION句、INTERSEC句での変更はない。ただし、OracleのMINUS句は、PostgreSQLではEXCEPT句に変更する必要がある。\\ | UNION句、INTERSEC句での変更はない。ただし、OracleのMINUS句は、PostgreSQLではEXCEPT句に変更する必要がある。\\ | ||
行 198: | 行 216: | ||
https:// | https:// | ||
- | 複合インデックスは最初の列から連続して列が指定されている場合にのみ機能するという制限があるからです。\\ | + | 複合インデックスは**最初の列から連続して列が指定されている場合にのみ機能する**という制限があるからです。\\ |
そのため、インデックス定義の途中の列から条件を指定するとインデックスが効かず遅くなる。 | そのため、インデックス定義の途中の列から条件を指定するとインデックスが効かず遅くなる。 | ||
< | < | ||
行 205: | 行 223: | ||
WHERE AA = xxx AND AB = xxx AND AC = xxx AND AD = xxx | WHERE AA = xxx AND AB = xxx AND AC = xxx AND AD = xxx | ||
</ | </ | ||
+ | |||
+ | ==== ダブルパイプ結合したインデックスは作成できない ==== | ||
+ | PostgreSQLではカラムをダブルパイプ結合するとインデックスが効かなくなります。\\ | ||
+ | Oracleではダブルパイプ結合したインデックス自体を作成できましたが、PostgreSQLではできません。\\ | ||
+ | PostgreSQLでは単一または複合インデックスを作成し、行値式を使用することでインデックスを効くようにします。\\ | ||
+ | |||
+ | < | ||
+ | SELECT * FROM TEST | ||
+ | WHERE | ||
+ | (UPDATE_DATE, | ||
+ | (UPDATE_DATE, | ||
+ | </ | ||
+ | ※Oracleの行値式は等価(=, | ||
==== ユーザ定義関数 ==== | ==== ユーザ定義関数 ==== | ||
=== NVL関数 === | === NVL関数 === |
it技術/データベース/postgresql/oracleからの移行.txt · 最終更新: 2023/12/18 13:16 by yajuadmin