最終更新日: 2015年3月9日
適用対象: SharePoint Foundation 2010
この記事の内容
"一意" の定義
一意列制約のサポート
一意性制約を伴う列のインデックス作成
プログラムによる一意性制約の設定
コンテンツの移行と一意列制約
列の制約を伴うコピーおよび移動の操作
リスト内またはライブラリ列内の値に一意性を適用することで、主キーを効果的に作成できます。以前は ID 列がリストやライブラリに一意性を与える唯一の手段でしたが、Microsoft SharePoint Foundation 2010 では "一意列制約" という新しい機能が導入されており、これを使用して一意性を適用できます。
"一意" の定義
一意性の宣言が些細な問題でないことは明らかなので、"一意" の意味を正確に定義することが重要です。SharePoint Foundation は、列の値を評価し、その列に含まれる値の評価に基づいて一意性を判断します。その評価のために、SharePoint Foundation は、サイト (SPWeb) の並べ替え順序を使用して、一意性の比較を行います。この比較では大文字と小文字が区別されないので、"hello world" という値が "Hello World" と同等であると評価されることに注意してください。
一意列制約のサポート
ある列で一意性制約がサポートされるかどうかを決定する重要な要因は、その列でインデックスを作成できるかどうかです。また、一意性がルックアップ列に適用されると、ターゲット リスト内のリスト アイテムは、子リスト (ルックアップ列が存在するリスト) からそのリスト アイテムを参照するリスト アイテムを 1 つしか持つことができません。つまり、一意性はターゲット リストの想定される列ではなく、ID 列に適用されます。以下では、インデックス作成機能をサポートしている列の種類と、サポートしていない列の種類を示します。
サポートされている列の種類
インデックスを作成でき、一意列制約がサポートされている列の種類を以下に示します。
1 行テキスト
選択肢フィールド (複数選択を除く)
数
通貨
日付/時刻
ルックアップ (複数値を除く)
ユーザーまたはグループ (複数値を除く)
タイトル (ドキュメント ライブラリ内のものを除く)
サポートされていない列の種類
以下に、インデックスを作成できず、一意列制約がサポートされていない列の種類を示します。
複数行テキスト
ハイパーリンク/画像
ユーザー設定フィールド型
集計フィールド
ブール値 (はい/いいえ)
更新者
更新日時
UI バージョン
作成日時
チェックアウト先
コンテンツ タイプ ID
一意性制約を伴う列のインデックス作成
前述のように、一意性制約を適用する列では、インデックスを作成する必要があります。ユーザーが [固有の値を適用する] を選択して [OK] をクリックすると、その列でまだインデックスが作成されていなければ警告ダイアログが表示されます。その場合は、その列のインデックス作成を自動的に行うオプションが提示されます。一意性を適用するように設定された列では、インデックス作成をオフにできません。ただし、事前に一意性制約の適用を無効にしておけば、その列のインデックス作成をオフにすることができます。
プログラムによる一意性制約の設定
一意な値を要求するように列を設定するには、SPField オブジェクトの EnforceUniqueValues プロパティを使用します。このプロパティでは、ブール値を取得および設定して、値の重複を許可するかどうかを指定します。既定では、値の重複が許可されているので、列フィールドのプロパティを明示的に true に設定する必要があります。
以下のコード例では、一意な値を要求するようにフィールドを変更しています。このフィールドは、プロパティ値の変更後に明示的に更新する必要があることに注意してください。
SPSite site = new SPSite("https://localhost");
SPWeb web = site.OpenWeb();
SPList custList = web.Lists["Customers"];
SPField custPhone = custList.Fields["Phone Number"];
custPhone.Indexed = true;
custPhone.EnforceUniqueValues = true;
/// You must call the Update() method
/// when you change the EnforceUniqueValues property
custPhone.Update();
エラーの発生 - 例外
EnforceUniqueValues プロパティを使用した一意性の適用に関連して発生するエラーには、次の 2 とおりがあります。
EnforceUniqueValues = true がインデックスの作成されていないフィールドに対して設定されている場合。
例外オブジェクト (SPException) がスローされ、"固有の値を適用するには、このフィールドにインデックス付けする必要があります。" というメッセージが表示されます。EnforceUniqueValues = true が既に値の重複があるリストに対して設定されている場合。
例外オブジェクト (SPException) がスローされ、"このフィールドには重複する値が含まれています。重複する値をすべて削除してから、再度操作してください。" というメッセージが表示されます。
コンテンツの移行と一意列制約
Microsoft.SharePoint.Deployment 名前空間の API を使用したコンテンツの移行では、エクスポート/インポート関数の使用によって、部分的 (選択的) なサイト コレクション移行と完全なサイト コレクション移行の両方がサポートされています。展開 API を完全移行シナリオで使用する際には、エクスポート元のリスト フィールドに一意性制約が設定されているかどうか (つまり、EnforceUniqueValues プロパティが true に設定されているかどうか)、またその設定をインポート先でも持続させる必要があるかどうかを確認する必要があります。
ただし、移行元サイト コレクションのファイルが移行先のファイルとマージされる部分的 (すなわち "選択的") な移行を行う場合は、以下で説明するように、その操作によって一意性の状態が自動的に考慮されます。
移行元の列が一意で、移行先の列が一意でない場合
アイテムが移行先 (ターゲット) にインポートされます。
続いて、移行先で EnforceUniqueValues プロパティが true に設定されます。
移行先のリストにアイテムの重複があって一意性制約に違反している場合、この操作は失敗する可能性があることに注意してください。その場合は、一意性プロパティの値は設定されず、試行は致命的でないエラーを返します。
移行元の列と移行先の列がどちらも一意な場合
リスト アイテムに対してエクスポート/インポートを通常どおりに実行します。
インポート パッケージ内のアイテムが一意性制約に違反している場合、この操作は失敗します。その場合は、このアイテムはインポートされず、試行は致命的でないエラーを返します。
移行元の列が一意でなく、移行先の列が一意な場合
まず、移行先で EnforceUniqueValues プロパティを false に設定して、移行先のフィールドの一意性を無効にします。
リスト アイテムを通常どおりに移行先にインポートします。
注意
上記の 3 つのシナリオは、RetainObjectIdentity プロパティがインポートで使用される場合にも有効です。この場合は、重複するアイテムを移行先でインポートするのではなく、移行先の既存のアイテムが移行元からエクスポートされるアイテムに一致するように更新されます。
列の制約を伴うコピーおよび移動の操作
一意列制約を適用しているドキュメント ライブラリにアイテムをコピーまたは移動したり、CopyTo(String) メソッドと MoveTo(String) メソッドを SPFile クラスで使用してこれらの操作を実行したりする場合には必ず、特別な考慮事項が発生します。このようなライブラリにファイルを移動またはコピーする状況では、この点に注意する必要があります。
MoveTo() を使用する状況ではデータ損失の可能性があること、また CopyTo() を使用する状況では (移行元のファイルが削除されないので) この可能性が大幅に低下することから、MoveTo() 操作では一意列制約をブロックして CopyTo() 操作では一意列制約を許可する、という一般的な規則に従うことになります。以下に、その詳細を示します。
Copy To operation |
Move To operation |
|
同じドキュメント ライブラリ内での操作 |
一意性への違反がドキュメント レベルでチェックされます。ライブラリ フォルダー間でのチェックは行われません。 |
チェックなしで移動が行われます。 |
異なるドキュメント ライブラリ間での操作 |
値が null に変換されます。 |
移行先のリストに一意な値が適用されている場合は移動がブロックされます。 |
ドキュメント ライブラリ外への操作 |
影響はありません。 |
影響はありません。 |
ドキュメントライブラリ内への操作 |
値が null に変換されます。 |
値が null に変換されます。 |