2013-12-10 211 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),使之成为主键。然后,您可以在更新中使用它,并确保只更新一行。