實(shí)現(xiàn)刪除主表數(shù)據(jù)時(shí), 判斷與之關(guān)聯(lián)的外鍵表是否有數(shù)據(jù)_Mssql數(shù)據(jù)庫(kù)教程
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!
推薦:經(jīng)驗(yàn)總結(jié):講解大型數(shù)據(jù)庫(kù)的設(shè)計(jì)準(zhǔn)則這篇文章主要介紹了大型數(shù)據(jù)庫(kù)設(shè)計(jì)所應(yīng)掌握的基本準(zhǔn)則,具體內(nèi)容請(qǐng)參考下文。 一個(gè)好的數(shù)據(jù)庫(kù)產(chǎn)品不等于就有一個(gè)好的應(yīng)用系統(tǒng),如果不能設(shè)計(jì)一個(gè)合理的數(shù)據(jù)庫(kù)模型,不僅會(huì)增加客戶端和服務(wù)器
問(wèn)題描述:
某個(gè)基礎(chǔ)信息表,與系統(tǒng)中30多個(gè)表存在外鍵關(guān)系,當(dāng)刪除基礎(chǔ)數(shù)據(jù)時(shí),需要判斷是否已經(jīng)被用過(guò),如果用過(guò)則更改標(biāo)志位,如果沒(méi)有用過(guò)則直接刪除,如何能很好實(shí)現(xiàn)這個(gè)處理?最好能夠自動(dòng)適應(yīng)表的變化
問(wèn)題解決(SQL Server 2005)
-- SQL Server 2005的錯(cuò)誤處理容易控制, 因此, SQL Server 2005中可以直接刪除, 通過(guò)錯(cuò)誤處理來(lái)確定是否需要更新.
-- 示例如下.
USE tempdb
GO
CREATE TABLE m(
id int PRIMARY KEY,
bz bit)
INSERT m SELECT 1, 0
UNION ALL SELECT 2, 0
CREATE TABLE c(
id int primary key,
a_id int references m(id)
ON DELETE NO ACTION)
INSERT c SELECT 1, 1
GO
-- 刪除處理存儲(chǔ)過(guò)程
CREATE PROC dbo.p_delete
@id int
AS
SET NOCOUNT ON
BEGIN TRY
BEGIN TRAN
DELETE FROM m WHERE id = @id
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
IF ERROR_NUMBER() = 547 -- 如果是外鍵約束錯(cuò)誤
BEGIN
BEGIN TRY
BEGIN TRAN -- 更新標(biāo)志
UPDATE m SET bz = 1
WHERE id = @id
COMMIT TRAN
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE()
END CATCH
END
ELSE
SELECT ERROR_NUMBER(), ERROR_MESSAGE()
END CATCH
GO
-- 調(diào)用
EXEC dbo.p_delete 1
EXEC dbo.p_delete 2
SELECT * FROM m
SELECT * FROM c
GO
DROP TABLE c, m
DROP PROC dbo.p_delete
問(wèn)題解決(SQL Server 2000)
-- SQL Server 2000 對(duì)錯(cuò)誤處理不好控制, 一般還是建議做判斷
-- 通過(guò)系統(tǒng)表查詢系統(tǒng)表,可以獲取某個(gè)表關(guān)聯(lián)的所有外鍵表
-- 示例存儲(chǔ)過(guò)程
CREATE PROC dbo.p_Delete
@tbname sysname, -- 基礎(chǔ)數(shù)據(jù)表名
@PkFieldName sysname, -- 基礎(chǔ)數(shù)據(jù)表關(guān)鍵字段名
@PkValue int -- 要?jiǎng)h除的基礎(chǔ)數(shù)據(jù)表關(guān)鍵字值
AS
SET NOCOUNT ON
DECLARE @bz bit, @s nvarchar(4000)
DECLARE tb CURSOR LOCAL
FOR
SELECT N'
SET @bz = CASE WHEN EXISTS(
SELECT * FROM ' QUOTENAME(@tbname)
N' A, ' QUOTENAME(OBJECT_NAME(B.fkeyid))
N' B
WHERE A.' QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.rkey AND id = B.rkeyid))
N' = B.' QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.fkey AND id = B.fkeyid))
N' AND A.' QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.rkey AND id = B.rkeyid))
N' = @id) THEN 1 ELSE 0 END'
FROM sysobjects A
JOIN sysforeignkeys B
ON A.id= B.constid
JOIN sysobjects C
ON A.parent_obj = C.id
WHERE A.xtype = 'f'
AND C.xtype = 'U'
AND OBJECT_NAME(B.rkeyid) = @tbname
OPEN tb
FETCH tb INTO @s
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_executesql @s, N'@tbname sysname, @id int, @bz bit OUT', @tbname, @PkValue, @bz OUT
IF @bz = 1
BEGIN
SET @s = N'UPDATE ' QUOTENAME(@tbname)
N' SET bz = 1 WHERE ' QUOTENAME(@PkFieldName)
N' = @id'
EXEC sp_executesql @s, N'@id int', @PkValue
RETURN
END
FETCH tb INTO @s
END
CLOSE tb
DEALLOCATE tb
SET @s = N'DELETE FROM ' QUOTENAME(@tbname)
N' WHERE ' QUOTENAME(@PkFieldName)
N' = @id'
EXEC sp_executesql @s, N'@id int', @PkValue
GO
注意事項(xiàng)
設(shè)置表的主/外鍵關(guān)系的時(shí)候,不要設(shè)置級(jí)聯(lián)刪除(ON DELETE CASCADE)
分享:SQL Server各種日期計(jì)算方法之二 上個(gè)月的最后一天 這是一個(gè)計(jì)算上個(gè)月最后一天的例子。它通過(guò)從一個(gè)月的最后一天這個(gè)例子上減去3毫秒來(lái)獲得。有一點(diǎn)要記住,在Sql Server中時(shí)間是精確到3毫秒。這就是為
相關(guān)Mssql數(shù)據(jù)庫(kù)教程:
- sql 語(yǔ)句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無(wú)法查看數(shù)據(jù)庫(kù),提示 無(wú)法為該請(qǐng)求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語(yǔ)句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過(guò)程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫(kù)教程推薦
- 解讀SQL Server如何備份文件導(dǎo)入當(dāng)前數(shù)據(jù)庫(kù)
- SSB(SQLservice Service Broker) 入門實(shí)例介紹
- 教你幾個(gè)MySQL鮮為人知特殊技巧
- 解讀為SQL Server數(shù)據(jù)庫(kù)傳數(shù)組參數(shù)的變通辦法
- 基于SQL Server中如何比較兩個(gè)表的各組數(shù)據(jù) 圖解說(shuō)明
- SQL查詢語(yǔ)句精華使用簡(jiǎn)要
- 數(shù)據(jù)庫(kù)中兩張表之間的數(shù)據(jù)同步增加、刪除與更新實(shí)現(xiàn)思路
- 詳細(xì)解析SQL Server安裝sp4補(bǔ)丁報(bào)錯(cuò)的方法
- SQL Server的基本功能性語(yǔ)句介紹
- 解決Mysql服務(wù)無(wú)法啟動(dòng)的1067錯(cuò)誤
猜你也喜歡看這些
- mysql占用CPU過(guò)高的解決辦法(添加索引)
- SQL Server Management Studio 沒(méi)有出來(lái)
- 用MyEclipse配置DataBase Explorer(圖示)
- Mysql,phpmyadmin密碼忘了怎么辦
- 解析:內(nèi)聯(lián),左外聯(lián),右外聯(lián),全連接,交叉連接的區(qū)別
- 解析mysql數(shù)據(jù)庫(kù)還原錯(cuò)誤:(mysql Error Code: 1005 errno 121)
- C# Mysql 查詢 Rownum的解決方法
- SQL分組排序去重復(fù)的小實(shí)例
- 解決MYSQL出現(xiàn)Can''t create/write to file ''#sql_5c0_0.MYD''的問(wèn)題
- MySQL筆記之?dāng)?shù)據(jù)類型詳解
- 相關(guān)鏈接:
復(fù)制本頁(yè)鏈接| 搜索實(shí)現(xiàn)刪除主表數(shù)據(jù)時(shí), 判斷與之關(guān)聯(lián)的外鍵表是否有數(shù)據(jù)
- 教程說(shuō)明:
Mssql數(shù)據(jù)庫(kù)教程-實(shí)現(xiàn)刪除主表數(shù)據(jù)時(shí), 判斷與之關(guān)聯(lián)的外鍵表是否有數(shù)據(jù)
。