外部キーを作成するときは、常に1つをヌル可能にするか、1つの外部キー定義を省略します。
これにより、サイクルが中断されます。
最も単純なケース(SQL構文が、SAMPE原理が適用されます):
CREATE TABLE Employee (
EmployeeId INTEGER NOT NULL IDENTITY(1,1)
ManagerId INTEGER NOT NULL
--...
PRIMARY KEY EmployeeId NONCLUSTERED
)
または、次のように:
CREATE TABLE Employee (
EmployeeId INTEGER NOT NULL IDENTITY(1,1)
ManagerId INTEGER NULL
--...
PRIMARY KEY EmployeeId NONCLUSTERED
FOREIGN KEY FK_Manager REFRENCES Employee(EmployeeId)
)
私が好む、次のように
CREATE TABLE Employee (
EmployeeId INTEGER NOT NULL IDENTITY(1,1)
ManagerId INTEGER NOT NULL
--...
PRIMARY KEY EmployeeId NONCLUSTERED
FOREIGN KEY FK_Manager REFRENCES Employee(EmployeeId)
)
がループを分けることができます外部キーを宣言するとき、常にダイアグラムをトレースし、サイクルがないことを確認する。私はすべてのサイクルが壊れるまで、最も危険でないキーは省略します。これにより、すべての表を一括エクスポートしてから別のデータベースに一括インポートすることができます。
編集:私はあなたが本エキスパートにこの質問をするときに、削除中に外部キーをオフにするような答えを得ることがわかります。これは2つの理由で間違っています。まず、通常のトランザクション操作でスキーマ定義が変更されるべきではありません。第2に、コードの残りの部分は外部キーがそこに存在することを期待しているため、アプリケーションコードでそれを処理しません。スキーマの変更には、トランザクション間の出血やテーブル全体のロックが厄介な癖があります。
Bam!これは素晴らしい仕事...ありがとう!私は実際に削除する前に片側をヌルにすると思っていなかったので、私はそれをどうにかしていた。しかし、 'onDelete:SET NULL'がキーでした。今私は理解し、それは動作します! –
@ nick-langうれしいわよ! – ybull