是這樣的,我想刪除資料庫中的一筆資料,可是卻跑出這個問題
請問這個該如何處理?
這是我欲刪除資料的table
CREATE TABLE [dbo].[Case] (
[CaseOid] BIGINT IDENTITY (1, 1) NOT NULL,
[CaseUid] UNIQUEIDENTIFIER NOT NULL,
[CustomerUid] UNIQUEIDENTIFIER NOT NULL,
[CaseId] VARCHAR (50) CONSTRAINT [DF_Case_CaseId] DEFAULT ('') NOT NULL,
[CaseName] NVARCHAR (50) CONSTRAINT [DF_Case_CaseName] DEFAULT ('') NOT NULL,
[IdNo] VARCHAR (30) CONSTRAINT [DF_Case_IdNo] DEFAULT ('') NOT NULL,
[PatNo] VARCHAR (30) CONSTRAINT [DF_Case_PatNo] DEFAULT ('') NOT NULL,
[CaseNo] VARCHAR (20) NULL,
[Birth] DATE CONSTRAINT [DF_Case_Birth] DEFAULT ('1900/01/01') NOT NULL,
[Age] AS (datediff(year,[Birth],getdate())-case when datediff(day,dateadd(year,datediff(year,[Birth],getdate()),[Birth]),getdate())<(0) then (1) else (0) end),
[Gender] VARCHAR (1) CONSTRAINT [DF_Case_Sex] DEFAULT ('') NOT NULL,
[Education] VARCHAR (1) CONSTRAINT [DF_Case_Education] DEFAULT ('') NULL,
[Religion] VARCHAR (1) CONSTRAINT [DF_Case_Religion] DEFAULT ('') NULL,
[ReligionNote] NVARCHAR (20) NULL,
[GovCity] NVARCHAR (10) CONSTRAINT [DF_Case_GovCity] DEFAULT ('') NOT NULL,
[GovTownship] NVARCHAR (10) CONSTRAINT [DF_Case_GovTownship] DEFAULT ('') NOT NULL,
[GovAddress] NVARCHAR (500) CONSTRAINT [DF_Case_GovAddress] DEFAULT ('') NOT NULL,
[City] NVARCHAR (10) CONSTRAINT [DF_Case_City] DEFAULT ('') NOT NULL,
[Township] NVARCHAR (10) CONSTRAINT [DF_Case_Township] DEFAULT ('') NOT NULL,
[Address] NVARCHAR (500) CONSTRAINT [DF_Case_Address] DEFAULT ('') NOT NULL,
[Tel] VARCHAR (50) CONSTRAINT [DF_Case_Tel] DEFAULT ('') NOT NULL,
[Mobile] VARCHAR (50) CONSTRAINT [DF_Case_Mobile] DEFAULT ('') NULL,
[IsMountainAborigine] VARCHAR (1) NULL,
[ElderMonthPay] NVARCHAR (20) NULL,
[IncomeSource] NVARCHAR (50) NULL,
[GovAllowance] NVARCHAR (50) NULL,
[OtherIncome] NVARCHAR (50) NULL,
[Note] NVARCHAR (500) NULL,
[Status] CHAR (1) CONSTRAINT [DF_Case_Status] DEFAULT ('') NOT NULL,
[CaseStatus] VARCHAR (5) CONSTRAINT [DF_Case_CaseStatus] DEFAULT ('') NOT NULL,
[CaseType] VARCHAR (5) CONSTRAINT [DF_Case_CareType] DEFAULT ('') NOT NULL,
[LastCaseIpdNo] VARCHAR (11) CONSTRAINT [DF_Case_LastCaseIpdNo] DEFAULT ('') NULL,
[LastCaseIpdUnit] VARCHAR (10) CONSTRAINT [DF_Case_LastCaseIpdUnit] DEFAULT ('') NULL,
[LastCaseStaName] NVARCHAR (20) CONSTRAINT [DF_Case_LastCaseStaName] DEFAULT ('') NULL,
[LastCaseBed] NVARCHAR (20) CONSTRAINT [DF_Case_LastCaseBed] DEFAULT ('') NULL,
[ChronicDiseases] VARCHAR (2) NULL,
[TakeMedicine] VARCHAR (2) NULL,
[Allergies] VARCHAR (2) NULL,
[AttackBehavior] VARCHAR (2) NULL,
[AttackBehaviorNote] NVARCHAR (50) NULL,
[Suicidal] VARCHAR (2) NULL,
[SuicidalNote] NVARCHAR (50) NULL,
[LostRisk] VARCHAR (2) NULL,
[LostRiskNote] NVARCHAR (50) NULL,
[LastCaseUnit] VARCHAR (5) CONSTRAINT [DF_Case_LastCaseUnit] DEFAULT ('') NULL,
[DateofApplication] DATE NULL,
[OpeningDate] DATE NULL,
[CreateTime] DATETIME NOT NULL,
[CreateUserUid] UNIQUEIDENTIFIER NOT NULL,
[ModifyTime] DATETIME NULL,
[ModifyUserUid] UNIQUEIDENTIFIER NULL,
CONSTRAINT [PK_Case] PRIMARY KEY NONCLUSTERED ([CaseUid] ASC),
CONSTRAINT [CI_Case] UNIQUE CLUSTERED ([CaseOid] ASC)
);
GO
EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'教育程度', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'Case', @level2type = N'COLUMN', @level2name = N'Education';
GO
EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'是否山地原住民(''Y''or''N'')', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'Case', @level2type = N'COLUMN', @level2name = N'IsMountainAborigine';
上面顯示起衝突的table
CREATE TABLE [dbo].[CaseLanguage] (
[CaseLanguageOid] BIGINT IDENTITY (1, 1) NOT NULL,
[CaseLanguageUid] UNIQUEIDENTIFIER NOT NULL,
[CaseUid] UNIQUEIDENTIFIER NOT NULL,
[LanguageId] NVARCHAR (10) NOT NULL,
[LanguageName] NVARCHAR (10) NOT NULL,
[Note] NVARCHAR (500) NULL,
[CreateTime] DATETIME NOT NULL,
[CreateUserUid] UNIQUEIDENTIFIER NOT NULL,
[ModifyTime] DATETIME NULL,
[ModifyUserUid] UNIQUEIDENTIFIER NULL,
CONSTRAINT [PK_CaseLanguage] PRIMARY KEY NONCLUSTERED ([CaseLanguageUid] ASC),
CONSTRAINT [CI_CaseLanguage] UNIQUE CLUSTERED ([CaseLanguageOid] ASC),
CONSTRAINT [FK_CaseLanguage_Case] FOREIGN KEY ([CaseUid]) REFERENCES [dbo].[Case] ([CaseUid])
);
根據這篇的話
是修改(drop-add)CaseLanguage的constraint
詳細如下
ALTER TABLE dbo.CaseLanguage
DROP CONSTRAINT FK_CaseLanguage_Case
ALTER TABLE dbo.CaseLanguage
ADD CONSTRAINT FK_CaseLanguage_Case
FOREIGN KEY (CaseUid) REFERENCES dbo.Case(CaseUid) ON DELETE CASCADE
修改完成之後
只要 Delete dbo.Case 時
就會連帶 delete CaseLanguage 裡對應的那一筆一併刪除
海綿寶寶 大大的方式可以解決問題
這邊幫忙補上線上測試連結 : db<>fiddle
在我印象中不會這樣做,加上delete cascade很容易刪除表中的所有數據。
舉例
有部門表格跟員工表格,假如加上delete cascade
有人不小心下delete 部門,員工表格資料會跟著刪除,不會有報錯提醒
想請問一下,第一段是移除掉我這個FK
然後第二段是再次新增FK然後加入條件這樣嗎?
就是這個意思
我懂了,感謝
提供我個人習慣給大大參考:
新增資料邏輯需要先新增一方資料才能新增多方資料
刪除資料邏輯跟新增資料相反,要先刪除多方資料,才能刪除一方資料
,假如沒有這麼做,刪除時有FOREIGN KEY欄位會此錯誤,資料庫這樣設計就是要防止髒資料。
目前看起來你的一個case會有多個語言,所以才額外設計CaseLanguage多方表格
所以想要刪除case資料,你要先從CaseLanguage表格資料刪除再刪除case表格資料
另外小補充,記得下select into備份資料,避免之後使用者反悔,臨時又要把資料找回情況,做一個保險。
以下是測試Script
--測試DDL
CREATE TABLE [dbo].[Case] (
[CaseOid] BIGINT IDENTITY (1, 1) NOT NULL,
[CaseUid] UNIQUEIDENTIFIER NOT NULL,
CONSTRAINT [PK_Case] PRIMARY KEY NONCLUSTERED ([CaseUid] ASC),
CONSTRAINT [CI_Case] UNIQUE CLUSTERED ([CaseOid] ASC)
);
CREATE TABLE [dbo].[CaseLanguage] (
[CaseLanguageOid] BIGINT IDENTITY (1, 1) NOT NULL,
[CaseLanguageUid] UNIQUEIDENTIFIER NOT NULL,
[CaseUid] UNIQUEIDENTIFIER NOT NULL,
CONSTRAINT [PK_CaseLanguage] PRIMARY KEY NONCLUSTERED ([CaseLanguageUid] ASC),
CONSTRAINT [CI_CaseLanguage] UNIQUE CLUSTERED ([CaseLanguageOid] ASC),
CONSTRAINT [FK_CaseLanguage_Case] FOREIGN KEY ([CaseUid]) REFERENCES [dbo].[Case] ([CaseUid])
);
insert into [Case] ([CaseUid]) values ('62338D53-E01A-4765-97CF-104A4C1BC5E3' );
insert into [CaseLanguage] ([CaseLanguageUid],[CaseUid]) values (NEWID ( ) ,'62338D53-E01A-4765-97CF-104A4C1BC5E3' );
--先刪除一方資料會報547錯誤
delete [Case] where [CaseUid] = '62338D53-E01A-4765-97CF-104A4C1BC5E3' --The DELETE statement conflicted with the REFERENCE constraint "FK_CaseLanguage_Case". The conflict occurred in database "TEST", table "dbo.CaseLanguage", column 'CaseUid'.
--正常刪除,從多方資料刪除後再刪除一方資料
delete [CaseLanguage] where [CaseUid] = '62338D53-E01A-4765-97CF-104A4C1BC5E3'
delete [Case] where [CaseUid] = '62338D53-E01A-4765-97CF-104A4C1BC5E3'