1

次の tFather および tChild テーブルがあります。

IF OBJECT_ID('dbo.tChild', 'U') IS NOT NULL
   DROP TABLE dbo.tChild

IF OBJECT_ID('dbo.tFather', 'U') IS NOT NULL
   DROP TABLE dbo.tFather


CREATE TABLE [dbo].[tFather](
    [ID] [bigint] NOT NULL,
    [fld1] [varchar](50) NULL,
CONSTRAINT [PK_tFather] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tChild](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [tFather_ID] [bigint] NULL,
    [fld1] [nvarchar](50) NULL,
CONSTRAINT [PK_tChild] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[tChild]  WITH CHECK ADD  CONSTRAINT [FK_tChild_tFather] FOREIGN KEY([tFather_ID])
REFERENCES [dbo].[tFather] ([ID])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[tChild] CHECK CONSTRAINT [FK_tChild_tFather]
GO


INSERT INTO dbo.tFather (ID, fld1) VALUES ('1', 'a')

INSERT INTO dbo.tChild (tFather_ID, fld1) VALUES ('1', 'X')
INSERT INTO dbo.tChild (tFather_ID, fld1) VALUES ('1', 'Y')
INSERT INTO dbo.tChild (tFather_ID, fld1) VALUES ('1', 'Z')

SELECT * FROM dbo.tFather

ID | fld1
---------
 1 | a

SELECT * FROM dbo.tChild

ID | tFather_ID | fld1
----------------------
 1 |          1 | X
 2 |          1 | Y
 3 |          1 | Z

ここまでは順調ですね !tFather から行を削除すると、カスケード削除/更新のために、すべての行が tChild から正常に削除されます

問題は、tChild から行を削除すると、最後の行を削除してから tFather の行も削除されるまで、すべてが正常に行われることです。これは非常に奇妙です。

同じデータベースに多くの関連テーブルがあり、それらは正常に動作します (tChild でレコードが削除されても、tFather でレコードは削除されません (テーブル名はシンボリックなので、関係の種類を理解できます))

動作をテストしましょう:

DELETE FROM dbo.tChild WHERE ID='3'

SELECT * FROM dbo.tFather

ID | fld1
---------
 1 | a

SELECT * FROM dbo.tChild

ID | tFather_ID | fld1
----------------------
 1 |          1 | X
 2 |          1 | Y


DELETE FROM dbo.tChild WHERE ID='2'

SELECT * FROM dbo.tFather

ID | fld1
---------
 1 | a

SELECT * FROM dbo.tChild

ID | tFather_ID | fld1
----------------------
 1 |          1 | X


DELETE FROM dbo.tChild WHERE ID='1'

SELECT * FROM dbo.tFather

ID | fld1
---------
          << - HERE IS THE PROBLEM !!! NO ROWS !!!!!

SELECT * FROM dbo.tChild

ID | tFather_ID | fld1
----------------------

何がそのような動作を引き起こす可能性がありますか?

どんな提案も素晴らしいでしょう

ありがとうございました

4

1 に答える 1

0

この問題は、ON UPDATE CASCADE と ON DELETE CASCADE に関係していると思われます。ただし、提示したコードは正常に機能し、カスケードは正常に機能します。つまり、父親を削除すると、そのすべての子が削除されます。

于 2013-05-15T11:31:15.440 に答える