1

犬と猫の 2 つのテーブルを持つ Microsoft SQL データベースがあります。

"dog" テーブルには "food" という主キー列があり、これは "food" という列と関連しており、外部キーとして機能する "cat" テーブルにもあります。

テーブル間の関係には「on delete cascade」ルール セットがあるため、「dog」テーブルから行を削除すると、「cat」テーブルの関連する行も削除する必要があります。

しかし、「cat」テーブルの行は削除され、残ります。Microsoft SQL データベース マネージャーを使用して、"dog" テーブルの行を削除します。

なぜこれが起こるのか分かりますか?この方法で行を削除するには、特別な delete sql コマンドを使用する必要がありますか?

//編集

テーブルのスクリプトは次のとおりです。

USE [VELES]
GO
/****** Object:  Table [dbo].[Periods]    Script Date: 01/18/2011 14:52:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Periods](
    [PeriodID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    [PeriodName] [nvarchar](50) COLLATE Hebrew_CS_AS NULL,
    [PeriodStartDate] [smalldatetime] NOT NULL,
    [PeriodEndDate] [smalldatetime] NOT NULL,
 CONSTRAINT [PK_Periods] PRIMARY KEY CLUSTERED 
(
    [PeriodID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


USE [VELES]
GO
/****** Object:  Table [dbo].[Exams]    Script Date: 01/18/2011 14:55:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Exams](
    [ExamID] [int] IDENTITY(1,1) NOT NULL,
    [ExamUserID] [char](7) COLLATE Hebrew_CS_AS NOT NULL,
    [ExamBase] [tinyint] NOT NULL,
    [ExamUserTimesAccessed] [tinyint] NULL,
    [ExamMaxTimesToOpen] [tinyint] NOT NULL,
    [ExamUserLastTimeOpened] [datetime] NULL,
    [ExamUserLastTimeFinished] [datetime] NULL,
    [ExamTimeToFinish] [int] NOT NULL,
    [ExamPassGrade] [int] NOT NULL,
    [ExamPeriod] [int] NOT NULL,
    [ExamUserRank] [tinyint] NULL,
 CONSTRAINT [PK_Exams] PRIMARY KEY CLUSTERED 
(
    [ExamID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
USE [VELES]
GO
ALTER TABLE [dbo].[Exams]  WITH CHECK ADD  CONSTRAINT [FK_Exams_Bases] FOREIGN KEY([ExamBase])
REFERENCES [dbo].[Bases] ([BaseID])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Exams]  WITH NOCHECK ADD  CONSTRAINT [FK_Exams_Periods] FOREIGN KEY([ExamPeriod])
REFERENCES [dbo].[Periods] ([PeriodID])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Exams]  WITH NOCHECK ADD  CONSTRAINT [FK_Exams_Users] FOREIGN KEY([ExamUserID])
REFERENCES [dbo].[Users] ([UserID])
ON UPDATE CASCADE
ON DELETE CASCADE
NOT FOR REPLICATION 
GO
ALTER TABLE [dbo].[Exams] CHECK CONSTRAINT [FK_Exams_Users]
GO
ALTER TABLE [dbo].[Exams]  WITH CHECK ADD  CONSTRAINT [UserRanks_Exams_FK1] FOREIGN KEY([ExamUserRank])
REFERENCES [dbo].[UserRanks] ([RankID])
ON UPDATE CASCADE
ON DELETE CASCADE
4

6 に答える 6

8

私は問題を解決しました。

Enforce Foreign Key Constraintリレーションシップウィンドウには、 「いいえ」に設定された、というオプションがありました。「はい」に設定すると、行の削除がうまく機能するようになりました。

于 2011-01-19T13:33:38.167 に答える
4

テーブル構造をより具体的に示してもらえますか? PK/FK が間違っているようです。

FK 部分 (子) を削除しても、PK レコード (親) には何も影響しません。PK レコードを削除した場合にのみ、リンクしている子レコードにカスケードされます。

于 2011-01-18T12:06:59.860 に答える
1

の列が の主キーであるfoodことは確かですか? というテーブルがある場合、その列は の主キーおよび外部キーである必要があります(および同様に)。次に、削除をオンにすると、対応する行がオンになり、削除されます。dogdogfoodfoodfooddogcaton delete cascadefooddogcat

于 2011-01-18T12:07:44.970 に答える
0

これは問題なく機能します。

delete from Periods where PeriodID = 1

Periods から 1 つの行を削除し、ExamPeriod = 1 を持つ Exams からすべての行を削除します。

于 2011-01-18T14:09:51.100 に答える
0

cat テーブルが外部キーのキーである場合、dog から行を削除しても、cat から行は削除されず、その逆になります。

于 2011-01-18T12:07:56.950 に答える