--咱們就以院系,班級,學生來舉例。 create TABLE [dbo].YuanXi ( Id int IDENTITY(1,1) NOT NULL,--學校id 自增量 YuanXiName varchar(50) null, --院系名字 ) create TABLE [dbo].Class ( Id int IDENTITY(1,1) NOT NULL,--班級id 自增量 YuanXiID int null,--院系id ClassName varchar(50) null --班級名字 ) create TABLE [dbo].Student ( Id int IDENTITY(1,1) NOT NULL,--學生id 自增量 ClassID int null,--班級id StudentName varchar(50) null,--學生姓名 ) --這個表是圖片表,我臨時加的,後面可能用這個演示 create TABLE [dbo].PathImg ( Id int IDENTITY(1,1) NOT NULL,--學校id 自增量 TableName varchar(50) null, --這個是代表,好比我要在信息工程學院價格圖片,那就要在改表中把XuanXi表的表名子加上,還有信息工程學院的id加上 TableNameId int null,--這個就是某一個表中的某一個id Path varchar(50) null, --存放班級照片路徑的 )
改就相對的容易多了,由於修改的時候主鍵必定不會變的(也就是表中的自增id了) ,至於改其餘信息那就不會影響到其餘表了,就算影響,好比我修改了YuanXi表中信息工程學院改爲藝術設計學院html
,雖然名字改了,可是Id沒有變,可能你們會說,對應Class表中的班級不是也要改變嗎,是的,是須要改變的,可是咱們能夠在班級列表的界面中點擊編輯按鈕進行編輯,從新給班級命名就i行了。web
由於Id沒有變。若是不想編輯,那就找到班級列表對這些班級進行刪除,或批量刪除就好了,而刪除方式在個人筆記中(http://www.javashuo.com/article/p-rojoxhzg-ho.html)已經作了詳細介紹了。sql
這裏我要作另外一種修改方式,上面的表好像沒有適用場景,和上面的表不要緊了。下面我要說的是我在開發中經常使用的一種修改方式了,這種修改時帶有必定邏輯型的修改,可不是修改一張死表那麼簡單了。仍是舉個例子吧!這個例子是web平臺和手機APP互相配合的。數據庫
好比一個任務表,一個任務步驟表和一個任務模板列表,(其實還須要步驟模板表的,添加的任務屬於哪一個任務模板,添加的步驟屬於哪一個步驟模板,這樣才合理,可是這裏就簡化了,直接用三個表了)spa
任務表中我在表中添加一個任務,而這個任務須要作3個步驟才能算完成任務。我把這個任務分配給了張三,而張三打開手機APP就應該看到屬於本身的任務了。他要作的就是把3個步驟完成,而後提交併存儲到數據裏的步驟表中。仍是把表建起來才能看的明白:翻譯
TaskStateID:表示任務狀態Id 數字表明: 1:未開始 2:處理中 3:待審覈 4:已完成設計
TaseMoBanID:表示該任務屬於哪一個任務模板code
具體流程:把任務派給張三,TaskStateID=1 任務未開始,若是張三完成了一部分任務,TaskStateID=2 任務已經在處理中 當張三把全部步驟都作完的時候,TaskStateID=3 任務屬於待審覈。 最後的審覈是有任務發起者審覈,若是審覈經過 那麼 TaskStateID=4 任務已完成htm
好比我任務已經派給張三了,那麼TaskStateID應該是1,任務還未開始,blog
咱們知道任務要三個步驟才能完成,張三每完成一個任務,他就要提交一次。在step表中添加步驟記錄,添加這裏不說,之說修改,咱們這時候就應該把Task表中TaskStateID的狀態修改成2處理中。可是在修改的時候數據庫有不知道,你到底完成了多少步驟,他只會修改,你可能只完成1步,也可能都完成了。這就須要咱們在數據庫中用邏輯來判斷了。
首先判斷當前張三完成了多少步驟,首先提交的時候會傳到數據庫中兩個參數;一個是 :TableName:表名 TableNameID :任務ID
咱們這裏直接定義方便後面寫存儲過程:
@TableName varchar(30)
@TabaleNameID int
1,從step表中查找記錄數
select Count(*) from Step where TableName=@TableName and TableNameID=@TableNameID
2,查找完成該任務一共須要多少步驟。(這裏要注意,這個修改是通用的。因此TableName傳過來的是數據庫中某一張表的表名字。是經過字符串表名來查數據庫的,因此和上面的不同,這個須要字符串拼接成sql語句了)
先找到任務模板的id
EXEC('SELECT TaskMoBanID FROM ' +@TableName+'where Id ='+@TableNameID) --這句sql代碼翻譯一下就是 執行sql語句:select TaskMoBanID from Task where Id =@TableNameID
經過任務模板id找到該任務完成須要的步驟數:
select MoBanStepCount from taskMoBan where Id=上一步獲得ID
3,拿張三當前提交後完成了多少步驟數與完成該任務的步驟數對比(注意,張三在APP上打開步驟數的時候已經有三個步驟顯示了,只是須要他去編輯完成,他不具備添加步驟的能力,步驟已經被模板限死了)
if 當前步驟數<完成該任務的步驟數
把任務狀態 修改爲TaskStateID=2 (處理中)
update Task set TaskMoBanID=2 where Id=@TableNameID
else
update Task set TaskMoBanID=3 where Id=@TableNameID
整理一下寫個存儲過程
USE [TestData] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[alterDemo] @TableName varchar(30)--字符串表名 @TabaleNameID int--表名id AS --定義兩個個變量,用來接收當前步驟數和完成該任務的總步驟數 declare @CurrentStepCount int declare @SumStepCount int --查詢當前記錄數,並賦值給變量 set @CurrentStepCount=(select count(*) from Step where TableName=@TableName and TableNameID=@TableNameID) --查詢完成該任務的總步驟數,並賦值給變量 --注意紅字,這個變量的定義必定要放在字符裏面,若是像前兩個同樣放在外面,執行這個語句就會報錯的,必定要注意 set @SumStepCount=EXEC('delcare @TaskMoBanID varchar(30) SELECT @TaskMoBanID=TaskMoBanID FROM ' +@TableName+'where Id ='+@TableNameID+'select MoBanStepCount from taskMoBan where Id=@TaskMoBanID') if @CurrentStepCount<@SumStepCount update Task set TaskMoBanID=2 where Id=@TableNameID else update Task set TaskMoBanID=3 where Id=@TableNameID
--上面EXEC()執行的字符語句翻譯普通sql語句:
delcare @TaskMoBanID varchar(30)//臨時任務模板id的存儲變量
SELECT @TaskMoBanID=TaskMoBanID FROM Task where Id =@TableNameID //用該變量接受查詢的結果
select MoBanStepCount from taskMoBan where Id=@TaskMoBanID//根據查詢的結果,再次查詢模板表中該任務模板的步驟數
好了,修改就說到這裏了,實際上通常都是單個表,畢竟修改的時候主鍵又不會變,其餘影響的在平臺上直接在編輯一下就好了。要麼直接刪除就好了,反而更省事些,可是就像上面我說的那種帶有邏輯模式的,那就要老老實實的寫sql代碼了。