2012-02-14 3 views
-1

위의 내용을 고려할 때 어느 테이블에도 레코드를 삭제할 수 없습니다. 깔끔한 해결책이 있습니까? 내가하고 싶은 것은 링크 테이블을 순수 링크 테이블로 만들고 그 자체로 값을 전달하지 않도록 디자인을 정렬하는 것입니다. 행이 실제로 삭제 될 필요가 없기 때문에 (플래그가 지정되었지만 실제로 삭제되지는 않음), 물론 DefaultValue가 NULL 일 수 있기 때문에 삽입 할 수 있기 때문에 지금까지는 문제가되지 않았습니다.SQL Server 삭제 딜레마

편집 : 내 downmarker에 대한 응답으로, 내가 언급 했어야합니다, 내가 모두 삭제 캐스케이드 및 트리거를 고려, 그 시나리오에 대한 대안을 찾고 명확하게 ON DELETE SET NULL이 작동하지 않습니다.

+0

하나의 가능성은'이 ON CASCADE' 당신의 외래 키 제약 조건에 추가 삭제하는 것입니다, 하지만 이로 인해 잠재적으로 엄청난 양의 레코드 삭제가 발생할 수 있습니다. 두 테이블. –

+0

- 실용적이지는 않습니다. 또한 ProjectTasks에 대한 삽입/업데이트 트리거 이후에 ​​고려됩니다 (삽입은 항상 DefaultValue에 대해 NULL로 이동해야하며 업데이트가 확인됩니다). – kpollock

+0

'DefaultTaskValue' 컬럼을 제거하고 또 다른'DefaultTaskvalue' 테이블을 생성해야합니다. 이렇게하면 모든 열을 'NOT NULL'로 설정할 수 있습니다. –

답변

1

이 나는 ​​명세서

놀랐다와의 DefaultValue가

NULL하고 그것을 지켜 볼 수밖에 없었습니다 수 있기 때문에 물론 당신은 삽입 할 수 있습니다. 복합 외부 키 열에 삽입 또는 행의 업데이트시에 널을 허용 및 열 중 적어도 하나를 정의되었는지 MSKB는 구체적

말한다 후 NULL로 설정된 외래 키 제약 조건은 입니다. 관련 열이 일치하는 관련 테이블에 행이없는 경우에도 마찬가지입니다.

나는이 정보를 알지 못했을 것으로 생각합니다. 그래서 나는 다음과 같은 명령을 제안한다

UPDATE ProjectTasks SET DefaultTaskValue = NULL *W 
DELETE TaskValues *W 
DELETE ProjectTasks *W 

* (W)가 (등 TaskID를에) 당신의 WHERE 조건

+0

아 - 그래, 훌륭해. 내가 할 수 있다는 것을 깨달았어야 했어. 꺼내려고 ... – kpollock

0

하나의 솔루션이 DefaultTaskValue 열을 제거하고 다른 DefaultTaskvalues 테이블을 작성합니다. 이렇게하면 모든 열을 NOT NULL으로 설정하고 계단식 효과를 원하는대로 설정할 수 있습니다.

ProjectTasks 테이블 :

CREATE TABLE [dbo].[ProjectTasks] 
(
    [TaskID] [int] IDENTITY(1,1) NOT NULL, 
    ... 
         --- removed: DefaultTaskValue] [int] NULL 
) 

ALTER TABLE [dbo].[ProjectTasks] 
    ADD CONSTRAINT [PK_ProjectTasks] 
    PRIMARY KEY CLUSTERED 
(
    [TaskID] ASC 
) 
GO 

TaskValues 테이블 :

CREATE TABLE [dbo].[TaskValues] 
(
    [TaskID] [int] NOT NULL, 
    [Value] [int] NOT NULL, 
    ... 
) 

ALTER TABLE [dbo].[TaskValues] 
    ADD CONSTRAINT [PK_TaskValues] 
    PRIMARY KEY CLUSTERED 
(
    [TaskID] ASC, 
    [Value] ASC 
) 

ALTER TABLE [dbo].[TaskValues] 
    ADD CONSTRAINT [FK_TaskValues_ProjectTasks] 
    FOREIGN KEY([TaskID]) 
    REFERENCES [dbo].[ProjectTasks] ([TaskID]) 
GO 

DefaultTaskValues 테이블 :

CREATE TABLE [dbo].[DefaultTaskValues] 
(
    [TaskID] [int] NOT NULL, 
    [Value] [int] NOT NULL, 
    ... 
) 

ALTER TABLE [dbo].[DefaultTaskValues] 
    ADD CONSTRAINT [PK_DefaultTaskValues] 
    PRIMARY KEY CLUSTERED 
(
    [TaskID] ASC 
) 

ALTER TABLE [dbo].[DefaultTaskValues] 
    ADD CONSTRAINT [FK_DefaultTaskValues_TaskValues] 
    FOREIGN KEY([TaskID], [Value]) 
    REFERENCES [dbo].[TaskValues] ([TaskID], [Value]) 
GO 
관련 문제