2

MS アクセスでデフォルト値または null 値を設定できません。たとえば、親行を削除しようとすると、影響を受ける子行の外部キーが NULL に設定されません。デザイン ビューでデフォルト値を NULL に設定しようとしましたが、うまくいかないようです。

ここに私のサンプルデータがあります:
スタッフテーブル:
ID | Name
1 | Tom
2 | Tim

顧客テーブル:
ID | Name | processed_By
1 | cust1 | 2

スタッフ テーブルから Tim を削除しても、cust1 のprocessed_By列には 2 が残っています。ただし、staff_table から Tim を削除した後、次のように実行する必要がありました。

ID | Name | processed_By
1 | cust1 | NULL

また

ID | Name | processed_By
1 | cust1 | 1

この質問を解決するのを手伝ってくれることを願っています。ありがとうございました。

4

3 に答える 3

2

これは、MS Access 2010 の新しいデータ マクロで簡単に実行できます。

テーブルが MS Access 以外で使用されている場合でも、データ マクロは機能します。OldAfter Delete マクロが作成される Staff テーブルに適用されるキーワード に注意してください。行/* deleteはコメントであり、純粋に説明用です。

データ マクロの削除

于 2013-01-20T14:55:07.703 に答える
2

私の印象は、あなたが探していたということですON DELETE SET NULL。Access は、Jet 4 (Access 2000) 以降、この関係機能をサポートしています。ただし、Access のユーザー インターフェイスには を設定するための準備がありませんON DELETE SET NULL。これは、VBA コードから行うか、SQL-92 モードで実行される DDL ステートメントを使用して行う必要があります。

イミディエイト ウィンドウで DDL ステートメントを実行しました。NoteCurrentProject.Connection.Executeは ADO メソッドです。これは、Access の既定の SQL-89 モードではなく、SQL-92 モードでクエリが実行されることを意味します。

strSql = "ALTER TABLE Customer" & vbCrLf & _
    "ADD CONSTRAINT processed_By_FK" & vbCrLf & _
    "FOREIGN KEY (processed_By) REFERENCES staff(ID)" & vbCrLf & _
    "ON DELETE SET NULL"
CurrentProject.Connection.Execute strSql

その後、Timstaffのレコードを削除しました。この削除により、cust1の値が2 から Null に変更されました。Customer.processed_By

このアプローチが興味深いと思われる場合は、Cascade to Null Relationsの Allen Browneと、この Stack Overflow question: MS Access set cascade-to-null constraint to existing tableから詳細情報を見つけることができます。にはいくつかの「落とし穴」がありON DELETE SET NULLます。

于 2013-01-20T16:54:26.580 に答える
1

私はあなたがそれをすることができるとは思わない。無効化された子行を自動的に削除することはできますが、null に戻す組み込み関数はありません。

デザインでこれが本当に必要な場合は、vba を介してのみこれを行うことができますが、これはフォーム上のボタンでのみ行うことができます。テーブルで行を直接削除すると、アクセスでこれを行う方法がわかりません。

于 2013-01-20T14:13:08.927 に答える