2013-12-10 210 views
0

我有一個關於存儲過程的問題。假設我的數據庫中有2個表UserEducation數據庫存儲過程

Table User  Table Education 
UserID   University 
UserName   Qualification 
...    Field of Study 
...    ......... 
....    ......... 
....    UserID 

的問題,例如:有一個用戶二度(教育),當我試圖在程度的更新,它會同時更新程度。

這裏是我的存儲過程:

CREATE Procedure [dbo].[UpdateEducation] 
    @University, 
    @Qualification, 
    @FieldOfStudy, 
    @Grade, 
    @GDate, 
    @Location, 
    @Major, 
    @AddtionalInfo, 
    @UserID 
AS 
BEGIN 

Update Education SET 

University [email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected] 

WHERE [email protected] 

END 

GO 

希望有人能幫助我,我還是新來此。 Tq

+0

您的教育表是否有主鍵?如果是這樣,那是什麼?如果不是,你怎麼能唯一識別一個用戶的教育記錄? – Becuzz

+0

嗨,你的意思是像教育ID? –

+0

提供更好的標題! –

回答

0

您的存儲過程無法在技術上更新該行,而沒有唯一標識其正在更新的記錄所需的所有信息。

就可以解決這個幾個方面:

  1. 介紹在教育臺單獨的主鍵查找 目的。
  2. 將原始數據(在更新之前)傳遞到您存儲的 過程,以便您可以查找您嘗試更改的確切行 。
  3. 標識一個單獨的複合唯一鍵,可用於查找 ,該鍵不包含將要修改的數據。
  4. 使用一些可更新的光標(根據客戶端技術的不同,可能無法實現)。
0

你在那裏存在的主要問題是你的用戶表在教育表上將是一對多的。您的更新告訴它更新教育表中所有用戶ID = @UserId的記錄。您的更新聲明需要引用教育表中的特定行,按照這些行。

Update Education 
    set field = value 
where UserId = UserIdValue 
and {pickAnotherField} = newFieldValue 

但是你仍然可以運行多個和無意更新這樣的風險,較好的解決辦法是添加一個唯一的標識符(Education_ID),使之成爲主鍵。然後,您可以在更新中使用它,並確保只更新一行。