Sql 更新具有PK的记录

Sql 更新具有PK的记录,sql,sql-server-2000,Sql,Sql Server 2000,我想更新表上的电子邮件地址字段。我的问题是: UPDATE TableName SET emailaddress = 'someone@somewhere.com' WHERE Per_ID = '1234' 我得到的答复是: Violation of PRIMARY KEY constraint 'PK_TableName'. Cannot insert duplicate key in object 'TableName'. 问题: 有没有办法修改具有PKs的表中的字段 假设我

我想更新表上的电子邮件地址字段。我的问题是:

UPDATE TableName
    SET emailaddress = 'someone@somewhere.com'
WHERE Per_ID = '1234'
我得到的答复是:

Violation of PRIMARY KEY constraint 'PK_TableName'. 
Cannot insert duplicate key in object 'TableName'.
问题:

  • 有没有办法修改具有PKs的表中的字段
  • 假设我必须删除该行并插入新行,我应该担心吗 有不同的PK吗
  • 我该怎么办 提前谢谢

    以下是创建表脚本:

    USE [Web_Production]
    GO
    
    /****** Object:  Table [dbo].[Supported_Users]    Script Date: 07/23/2013 10:48:37 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Supported_Users](
        [Supported_Users_ID] [int] IDENTITY(1,1) NOT NULL,
        [Per_ID] [nvarchar](32) NULL,
        [EmailAddress] [nvarchar](80) NOT NULL,
        [SerialNum] [nvarchar](20) NULL,
        [Password] [nvarchar](255) NULL,
        [OSC_LastLogonDate] [datetime] NULL,
        [OSC_TotalLogons] [int] NULL,
        [CP_LastLogonDate] [datetime] NULL,
        [CP_TotalLogons] [int] NULL,
        [IRC_LastLogonDate] [datetime] NULL,
        [IRC_TotalLogons] [int] NULL,
        [AddDate] [datetime] NOT NULL,
        [AddUser] [nvarchar](50) NOT NULL,
        [ChangeDate] [datetime] NULL,
        [ChangeUser] [nvarchar](50) NULL,
        [SupportAccess] [bit] NULL,
        [confirmationID] [nvarchar](10) NULL,
        [ForcedExpiryDate] [datetime] NULL,
        [ManualAddition] [bit] NULL,
        [Industry] [nvarchar](50) NULL,
        [Roles] [nvarchar](255) NULL,
        [OLL_Token] [nvarchar](40) NULL,
        [OLL_AddDate] [datetime] NULL,
        [ShowSupport] [bit] NULL,
        [ShowForum] [bit] NULL,
        [ShowKB] [bit] NULL,
        [ShowTraining] [bit] NULL,
        [ForceReset] [bit] NULL,
     CONSTRAINT [PK_Supported_Users] PRIMARY KEY CLUSTERED 
    (
        [EmailAddress] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[Supported_Users] ADD  CONSTRAINT [DF_Supported_Users_TotalLogons]  DEFAULT (0) FOR [OSC_TotalLogons]
    GO
    
    ALTER TABLE [dbo].[Supported_Users] ADD  CONSTRAINT [DF_Supported_Users_CP_TotalLogons]  DEFAULT (0) FOR [CP_TotalLogons]
    GO
    
    ALTER TABLE [dbo].[Supported_Users] ADD  CONSTRAINT [DF_Supported_Users_IRC_TotalLogons]  DEFAULT (0) FOR [IRC_TotalLogons]
    GO
    
    ALTER TABLE [dbo].[Supported_Users] ADD  CONSTRAINT [DF_Supported_Users_ManualAddition]  DEFAULT (0) FOR [ManualAddition]
    GO
    
    ALTER TABLE [dbo].[Supported_Users] ADD  CONSTRAINT [DF_Supported_Users_ShowSupport]  DEFAULT (1) FOR [ShowSupport]
    GO
    
    ALTER TABLE [dbo].[Supported_Users] ADD  CONSTRAINT [DF_Supported_Users_ShowForum]  DEFAULT (1) FOR [ShowForum]
    GO
    
    ALTER TABLE [dbo].[Supported_Users] ADD  CONSTRAINT [DF_Supported_Users_ShowKB]  DEFAULT (1) FOR [ShowKB]
    GO
    
    ALTER TABLE [dbo].[Supported_Users] ADD  CONSTRAINT [DF_Supported_Users_ShowTraining]  DEFAULT (1) FOR [ShowTraining]
    GO
    
    ALTER TABLE [dbo].[Supported_Users] ADD  CONSTRAINT [DF_Supported_Users_ForceReset]  DEFAULT (0) FOR [ForceReset]
    GO
    

    出现PK违例错误消息的原因是您试图更新表中已有值的字段

    如果您知道想要实现什么,那么这就是SQL

    DELETE TableName
    WHERE  emailaddress = 'someone@somewhere.com' AND Per_ID = '1234'
    
    UPDATE TableName
        SET emailaddress = 'someone@somewhere.com'
    WHERE Per_ID = '1234
    

    您可以发布表的创建表脚本吗?您应该始终担心更改主键。它引用了其他表中的所有内容。似乎您正试图将
    电子邮件地址设置为数据库中已存在的某个内容,从而获得唯一性冲突错误。如果您希望
    电子邮件地址
    是可变的,它实际上不应该是主键的一部分。@BilltheLizard-更新了问题。@user1729889,这完全取决于您的要求。也许您希望更新旧行,也许您希望更新新行并删除旧行,等等。我们不知道这一点,我们只能告诉您,您的表和
    上不能有重复的电子邮件地址someone@somewhere.com“
    已经存在,顺便说一句,您不应该将emaill地址用作主键错误建议。您不想删除另一个密钥(可能与其他人的person_id有关)。您需要做的是确定另一个密钥是否存在错误,或者此密钥是否存在错误(此处typeos可能会导致问题),或者先前的密钥是否不再使用该电子邮件地址,或者您是否有两个具有相同电子邮件地址的不同用户如果你有重复的记录,删除有问题的记录是你能做的最糟糕的事情。