1

このスキーマでテーブルを定義しました:

CREATE TABLE [dbo].[Codings]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ParentId] [int] NULL,
    [CodeId] [int] NOT NULL,
    [Title] [nvarchar](50) COLLATE Arabic_CI_AI NOT NULL,

    CONSTRAINT [PK_Codings] 
       PRIMARY KEY CLUSTERED ([Id] ASC) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

そして、次のようなデータを入力してください:

Id          ParentId    CodeId      Title
----------- ----------- ----------- ----------
1           NULL        0           Gender
2           1           1           Male
3           1           2           Female
4           NULL        0           Educational Level
5           4           1           BS
6           4           2           MS
7           4           3           PHD

親であるレコード (Id = 1 または 4 など) を削除すると、すべての子が自動的に削除されます (ParentId = 1 または 4 を持つすべてのレコード)。

Id と Parent Id の関係 (および削除ルールのカスケードを設定) でできると思っていましたが、MMS でそれを行うと、[プロパティ] の [削除ルール] または [更新ルール] が無効になります。

私の質問は、これを達成するために何ができるでしょうか?

ありがとうございました

編集:

私が書いたとき (Id = 1 または 4 のように)、子ではなく親であるレコードを意味し、Id = 1 または 4 のようなクエリを意味するものではありません

一部の友人は、削除トリガーを介して実行できるとほのめかしましたが、リレーションを介して実行できると思いました

4

5 に答える 5

1

最初に ParentID 列にインデックスを定義する必要があるかもしれません。インデックスが作成されていない列に制約を設定することはできません。

于 2010-06-16T13:59:49.237 に答える
1

私は常にこれに対する解決策のスクリプトを作成します。アプリケーション内の IE で ID を検索し、すべての親 ID = ID を削除してから、親レコードを削除します。

于 2010-06-16T14:02:04.067 に答える
0

自己参照テーブルでカスケード削除を行うことはできないと思います。あなたはおそらく結合でそれを行うことができます。

Delete from codings
inner join codings2 on codings.id = codings2.parentid
where codings.id = myid

テストされていないことに注意してください。

于 2010-06-16T14:09:06.633 に答える
0

「DELETE TRIGGER」でそれを達成できます-それを使用して、一致する親を持つ行を削除するだけです。これは基本的にカスケード削除と同じことです。

CREATE TRIGGER t_Codings_delete
            ON Codings
         AFTER DELETE
AS
BEGIN

    DELETE Codings
      FROM Codings c
      JOIN DELETED d -- Virtual table containing rows you just deleted
        ON c.ParentId = d.Id

END
于 2010-06-16T13:57:42.830 に答える
0

OR句はどうですか?

Delete From TableName
Where ID = 4 OR ParentId = 4
于 2010-06-16T14:03:09.633 に答える