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'.
问题:
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可能会导致问题),或者先前的密钥是否不再使用该电子邮件地址,或者您是否有两个具有相同电子邮件地址的不同用户如果你有重复的记录,删除有问题的记录是你能做的最糟糕的事情。