私は、uniqueidentifier があった SQL サーバーの世界から来ました。オラクルに同等のものはありますか?この列は頻繁にクエリされるため、パフォーマンスが重要です。
.Net で GUID を生成し、それを Oracle に渡します。いくつかの理由で、オラクルで生成できないため、シーケンスを使用できません。
CREATE table test (testguid RAW(16) default SYS_GUID() )
このブログでは、相対的なパフォーマンスを調査しました。
他の人が述べているように、数値シーケンスと比較して GUID を使用するとパフォーマンスが低下します。とは言うものの、「 SYS_GUID() 」という名前の関数がOracle 8i 以降で利用可能で、生の同等物を提供します。
SQL> SELECT SYS_GUID() FROM DUAL;
SYS_GUID()
--------------------------------
248AACE7F7DE424E8B9E1F31A9F101D5
フォーマットされた GUID を返す関数を作成できます。
CREATE OR REPLACE FUNCTION GET_FORMATTED_GUID RETURN VARCHAR2 IS guid VARCHAR2(38) ;
BEGIN
SELECT SYS_GUID() INTO guid FROM DUAL ;
guid :=
'{' || SUBSTR(guid, 1, 8) ||
'-' || SUBSTR(guid, 9, 4) ||
'-' || SUBSTR(guid, 13, 4) ||
'-' || SUBSTR(guid, 17, 4) ||
'-' || SUBSTR(guid, 21) || '}' ;
RETURN guid ;
END GET_FORMATTED_GUID ;
/
したがって、交換可能な文字列を返します。
SQL> SELECT GET_FORMATTED_GUID() FROM DUAL ;
GET_FORMATTED_GUID()
--------------------------------------
{15417950-9197-4ADD-BD49-BA043F262180}
一部の Oracle プラットフォームは、Steven Feuerstein によって指摘されているように、似ているが一意の GUID 値を返すことに注意する必要があります。
2020 年 11 月 3 日更新: 10g では、Oracle は正規表現関数のサポートを追加しました。これは、関数を使用して連結を簡素化できることを意味しREGEXP_REPLACE()
ます。
REGEXP_REPLACE(
SYS_GUID(),
'([0-9A-F]{8})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{12})',
'{\1-\2-\3-\4-\5}'
)
この式は、によって返された文字列値SYS_GUID()
を 16 進数値の 5 つのグループに分割し、各グループの間に「-」を挿入して再構築します。
質問を正しく理解していれば、データベースに行を挿入するときに一意の ID を生成する必要があります。これを行うには、シーケンス
を
使用できます。 リンクはこちら
シーケンスを作成したら、次のように使用できます。
INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data');
RAW(16) は明らかに、uniqueidentifier MS SQL 型に相当するものとして推奨されています。
OracleではGUIDはMSSQLほど使用されていないため、NUMBERフィールド(nullおよび主キーではない)、シーケンス、および挿入時にトリガーを使用して(すべてのテーブルに対して)データを入力する傾向があります。
Oracle には一意の識別子はありません。
RAW (ちょっと面倒) または CHAR を使用して、自分で実装できます。整数を使用する場合と比較して、CHAR フィールドで JOIN するクエリのパフォーマンスは低下します (おそらく 40% 程度)。
分散/レプリケートされたデータベースを使用している場合、パフォーマンスへの影響はそれだけの価値があります。それ以外の場合は、整数を使用してください。
Oracle を使用する一般的な方法は、人工キーを作成することです。これは数値として定義された列です。シーケンスを介して移入されます。主キー定義を介して索引付け/制約されます。