實現(xiàn)刪除主表數(shù)據(jù)時, 判斷與之關聯(lián)的外鍵表是否有數(shù)據(jù)_Mssql數(shù)據(jù)庫教程
教程Tag:暫無Tag,歡迎添加,賺取U幣!
推薦:經(jīng)驗總結:講解大型數(shù)據(jù)庫的設計準則這篇文章主要介紹了大型數(shù)據(jù)庫設計所應掌握的基本準則,具體內(nèi)容請參考下文。 一個好的數(shù)據(jù)庫產(chǎn)品不等于就有一個好的應用系統(tǒng),如果不能設計一個合理的數(shù)據(jù)庫模型,不僅會增加客戶端和服務器
問題描述:
某個基礎信息表,與系統(tǒng)中30多個表存在外鍵關系,當刪除基礎數(shù)據(jù)時,需要判斷是否已經(jīng)被用過,如果用過則更改標志位,如果沒有用過則直接刪除,如何能很好實現(xiàn)這個處理?最好能夠自動適應表的變化
問題解決(SQL Server 2005)
-- SQL Server 2005的錯誤處理容易控制, 因此, SQL Server 2005中可以直接刪除, 通過錯誤處理來確定是否需要更新.
-- 示例如下.
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
-- 刪除處理存儲過程
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 -- 如果是外鍵約束錯誤
BEGIN
BEGIN TRY
BEGIN TRAN -- 更新標志
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
問題解決(SQL Server 2000)
-- SQL Server 2000 對錯誤處理不好控制, 一般還是建議做判斷
-- 通過系統(tǒng)表查詢系統(tǒng)表,可以獲取某個表關聯(lián)的所有外鍵表
-- 示例存儲過程
CREATE PROC dbo.p_Delete
@tbname sysname, -- 基礎數(shù)據(jù)表名
@PkFieldName sysname, -- 基礎數(shù)據(jù)表關鍵字段名
@PkValue int -- 要刪除的基礎數(shù)據(jù)表關鍵字值
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
注意事項
設置表的主/外鍵關系的時候,不要設置級聯(lián)刪除(ON DELETE CASCADE)
分享:SQL Server各種日期計算方法之二 上個月的最后一天 這是一個計算上個月最后一天的例子。它通過從一個月的最后一天這個例子上減去3毫秒來獲得。有一點要記住,在Sql Server中時間是精確到3毫秒。這就是為
相關Mssql數(shù)據(jù)庫教程:
- sql 語句練習與答案
- 深入C++ string.find()函數(shù)的用法總結
- SQL Server中刪除重復數(shù)據(jù)的幾個方法
- sql刪除重復數(shù)據(jù)的詳細方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫,提示 無法為該請求檢索數(shù)據(jù) 錯誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數(shù)的用法實例詳解
Mssql數(shù)據(jù)庫教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫教程推薦
- 解讀SQL Server如何備份文件導入當前數(shù)據(jù)庫
- SSB(SQLservice Service Broker) 入門實例介紹
- 教你幾個MySQL鮮為人知特殊技巧
- 解讀為SQL Server數(shù)據(jù)庫傳數(shù)組參數(shù)的變通辦法
- 基于SQL Server中如何比較兩個表的各組數(shù)據(jù) 圖解說明
- SQL查詢語句精華使用簡要
- 數(shù)據(jù)庫中兩張表之間的數(shù)據(jù)同步增加、刪除與更新實現(xiàn)思路
- 詳細解析SQL Server安裝sp4補丁報錯的方法
- SQL Server的基本功能性語句介紹
- 解決Mysql服務無法啟動的1067錯誤
猜你也喜歡看這些
- mysql占用CPU過高的解決辦法(添加索引)
- SQL Server Management Studio 沒有出來
- 用MyEclipse配置DataBase Explorer(圖示)
- Mysql,phpmyadmin密碼忘了怎么辦
- 解析:內(nèi)聯(lián),左外聯(lián),右外聯(lián),全連接,交叉連接的區(qū)別
- 解析mysql數(shù)據(jù)庫還原錯誤:(mysql Error Code: 1005 errno 121)
- C# Mysql 查詢 Rownum的解決方法
- SQL分組排序去重復的小實例
- 解決MYSQL出現(xiàn)Can''t create/write to file ''#sql_5c0_0.MYD''的問題
- MySQL筆記之數(shù)據(jù)類型詳解
- 相關鏈接:
復制本頁鏈接| 搜索實現(xiàn)刪除主表數(shù)據(jù)時, 判斷與之關聯(lián)的外鍵表是否有數(shù)據(jù)
- 教程說明:
Mssql數(shù)據(jù)庫教程-實現(xiàn)刪除主表數(shù)據(jù)時, 判斷與之關聯(lián)的外鍵表是否有數(shù)據(jù)
。