Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 违反标识列上的主键错误_Sql Server_Key_Constraints_Identity - Fatal编程技术网

Sql server 违反标识列上的主键错误

Sql server 违反标识列上的主键错误,sql-server,key,constraints,identity,Sql Server,Key,Constraints,Identity,这真让人发疯!有问题的代码已经运行了5年多 这是独家新闻 我正在使用主键(标识列)向表中插入…选择。我在插入时没有指定密钥-SQL Server按预期生成密钥 我在一个存储过程中进行插入,实际上,我在SSIS中以循环对循环的方式调用该存储过程。存储过程将批量插入行。它可能一次插入1000行,也可能插入50000行,这无关紧要。它将用于插入数千行的随机数个调用,然后它将突然失败,并出现错误 违反主键/重复 错误。如果我检查标识种子-它是正确的。如果我重新开始这个过程,它会在一段时间内工作得很好 插

这真让人发疯!有问题的代码已经运行了5年多

这是独家新闻

我正在使用主键(标识列)向表中插入…选择。我在插入时没有指定密钥-SQL Server按预期生成密钥

我在一个存储过程中进行插入,实际上,我在SSIS中以循环对循环的方式调用该存储过程。存储过程将批量插入行。它可能一次插入1000行,也可能插入50000行,这无关紧要。它将用于插入数千行的随机数个调用,然后它将突然失败,并出现错误

违反主键/重复

错误。如果我检查标识种子-它是正确的。如果我重新开始这个过程,它会在一段时间内工作得很好

插入的值来自我连接在一起的两个表,好像这很重要

我的大部分代码如下:

WHILE @pk <= @max_pk
BEGIN
   INSERT INTO tbl_claim_line (fk_batch_control_group, fk_claim, fk_provider, service_from_date, service_to_date, allowed, net_paid, COB, flex_1, flex_2, flex_3, flex_4)
      SELECT
         @fk_batch_control_group
         , c.pk_claim
         , p.pk_provider
         , i.date_of_service_from
         , i.date_of_service_to
         , i.allowed_amount
         , i.net_paid_amount
         , i.cob_amount
         , i.claimline_flex_1
         , i.claimline_flex_2
         , i.claimline_flex_3
         , i.claimline_flex_4
      FROM
         tbl_import i
      INNER JOIN 
         tbl_import__claim c ON i.claim_number = c.claim_number
      LEFT JOIN 
         tbl_import__provider p ON  ISNULL(i.provider_type,'') =  ISNULL(p.provider_type,'') 
             AND ISNULL(i.provider_specialty,'') =  ISNULL(p.provider_specialty,'') 
             AND  ISNULL(i.provider_zip_code,'') =  ISNULL(p.provider_zip_code,'')
      WHERE
          pk_import = @pk

    UPDATE tbl_import 
    SET fk_claim_line = SCOPE_IDENTITY() 
    WHERE pk_import = @pk

    SET @pk += 1
END

--TABLE DEFINITIONS...
CREATE TABLE [dbo].[tbl_claim_line](
    [fk_batch_control_group] [int] NOT NULL,
    [fk_claim] [int] NOT NULL,
    [fk_provider] [int] NULL,
    [service_from_date] [date] NULL,
    [service_to_date] [date] NULL,
    [allowed] [money] NULL,
    [net_paid] [money] NULL,
    [COB] [money] NULL,
    [flex_1] [varchar](200) NULL,
    [flex_2] [varchar](200) NULL,
    [flex_3] [varchar](200) NULL,
    [flex_4] [varchar](200) NULL,
    [pk_claim_line] [int] IDENTITY(1,1) NOT NULL,
    [insert_date] [datetime] NOT NULL,
 CONSTRAINT [PK_tbl_claim_line] PRIMARY KEY NONCLUSTERED 
(
    [pk_claim_line] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[tbl_claim_line] WITH CHECK 
ADD  CONSTRAINT [FK_tbl_claim_line_tbl_batch_control_group] 
FOREIGN KEY([fk_batch_control_group])
REFERENCES [dbo].[tbl_batch_control_group] ([pk_batch_control_group])
GO

ALTER TABLE [dbo].[tbl_claim_line] CHECK CONSTRAINT [FK_tbl_claim_line_tbl_batch_control_group]
GO

ALTER TABLE [dbo].[tbl_claim_line]  WITH CHECK 
ADD CONSTRAINT [FK_tbl_claim_line_tbl_claim] 
FOREIGN KEY([fk_claim])
REFERENCES [dbo].[tbl_claim] ([pk_claim])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[tbl_claim_line] CHECK CONSTRAINT [FK_tbl_claim_line_tbl_claim]
GO

ALTER TABLE [dbo].[tbl_claim_line]  WITH CHECK 
ADD CONSTRAINT [FK_tbl_claim_line_tbl_provider] 
FOREIGN KEY([fk_provider])
REFERENCES [dbo].[tbl_provider] ([pk_provider])
GO

ALTER TABLE [dbo].[tbl_claim_line] CHECK CONSTRAINT [FK_tbl_claim_line_tbl_provider]
GO

ALTER TABLE [dbo].[tbl_claim_line] ADD  CONSTRAINT [DF_tbl_claim_line__insert_date]  DEFAULT (getdate()) FOR [insert_date]
GO

----second table
CREATE TABLE [dbo].[tbl_import](
    [fk_claim_line] [int] NULL,
    [member_id] [varchar](50) NULL,
    [member_card_id] [varchar](50) NULL,
    [member_first_name] [varchar](50) NULL,
    [member_last_name] [varchar](50) NULL,
    [member_dob] [varchar](50) NULL,
    [member_gender] [varchar](50) NULL,
    [member_subscriber_relationship_code] [varchar](50) NULL,
    [member_address_line_1] [varchar](100) NULL,
    [member_address_line_2] [varchar](100) NULL,
    [member_city] [varchar](50) NULL,
    [member_state] [varchar](50) NULL,
    [member_zip] [varchar](50) NULL,
    [member_phone] [varchar](50) NULL,
    [member_email] [varchar](50) NULL,
    [subscriber_id] [varchar](50) NULL,
    [group_line_of_business] [varchar](50) NULL,
    [group_product] [varchar](50) NULL,
    [group_employer] [varchar](50) NULL,
    [provider_first_name] [varchar](50) NULL,
    [provider_last_or_full_name] [varchar](200) NULL,
    [provider_type] [varchar](200) NULL,
    [provider_specialty] [varchar](400) NULL,
    [provider_zip_code] [varchar](50) NULL,
    [provider_tax_id] [varchar](50) NULL,
    [medical_code_1] [varchar](10) NULL,
    [medical_code_1_description] [varchar](500) NULL,
    [medical_code_2] [varchar](10) NULL,
    [medical_code_2_description] [varchar](500) NULL,
    [medical_code_3] [varchar](10) NULL,
    [medical_code_3_description] [varchar](500) NULL,
    [medical_code_4] [varchar](10) NULL,
    [medical_code_4_description] [varchar](500) NULL,
    [medical_code_5] [varchar](10) NULL,
    [medical_code_5_description] [varchar](500) NULL,
    [medical_code_6] [varchar](10) NULL,
    [medical_code_6_description] [varchar](500) NULL,
    [medical_code_7] [varchar](10) NULL,
    [medical_code_7_description] [varchar](500) NULL,
    [medical_code_8] [varchar](10) NULL,
    [medical_code_8_description] [varchar](500) NULL,
    [medical_code_9] [varchar](10) NULL,
    [medical_code_9_description] [varchar](500) NULL,
    [medical_code_10] [varchar](10) NULL,
    [medical_code_10_description] [varchar](500) NULL,
    [medical_code_11] [varchar](10) NULL,
    [medical_code_11_description] [varchar](500) NULL,
    [medical_code_12] [varchar](10) NULL,
    [medical_code_12_description] [varchar](500) NULL,
    [medical_code_13] [varchar](10) NULL,
    [medical_code_13_description] [varchar](500) NULL,
    [medical_code_14] [varchar](10) NULL,
    [medical_code_14_description] [varchar](500) NULL,
    [medical_code_15] [varchar](10) NULL,
    [medical_code_15_description] [varchar](500) NULL,
    [medical_code_16] [varchar](10) NULL,
    [medical_code_16_description] [varchar](500) NULL,
    [date_of_service_from] [varchar](50) NULL,
    [date_of_service_to] [varchar](50) NULL,
    [claim_number] [varchar](50) NULL,
    [claim_line_number] [varchar](50) NULL,
    [original_claim_number] [varchar](50) NULL,
    [allowed_amount] [varchar](50) NULL,
    [net_paid_amount] [varchar](50) NULL,
    [cob_amount] [varchar](50) NULL,
    [date_paid] [varchar](50) NULL,
    [member_flex_1] [varchar](200) NULL,
    [member_flex_2] [varchar](200) NULL,
    [member_flex_3] [varchar](200) NULL,
    [member_flex_4] [varchar](200) NULL,
    [claim_flex_1] [varchar](200) NULL,
    [claim_flex_2] [varchar](200) NULL,
    [claim_flex_3] [varchar](200) NULL,
    [claim_flex_4] [varchar](200) NULL,
    [claimline_flex_1] [varchar](200) NULL,
    [claimline_flex_2] [varchar](200) NULL,
    [claimline_flex_3] [varchar](200) NULL,
    [claimline_flex_4] [varchar](200) NULL,
    [pk_import] [int] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_tbl_import] PRIMARY KEY NONCLUSTERED 
(
    [pk_import] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

有问题的代码已经运行了5年多。 它可能一次插入1000条记录,也可能插入50000条记录

您是否可能最终溢出了主键的整数类型


它是否已经结束,现在又重新开始?这将导致主键重复。

我遇到了这个问题,很像user3170349,这是专栏的种子问题。不过,我正在添加一些附加信息

首先,您可以运行此命令以确定是否存在种子问题:

DBCC CHECKIDENT ('TABLE_NAME_GOES_HERE', NORESEED);
这将为您提供如下信息:

Checking identity information: current identity value 'XXXX', current column value 'YYYY'.
如果YYYY大于XXXX,则您有问题,需要重新设置表的种子,以便重新启动。可以使用以下命令执行此操作:

DBCC CHECKIDENT ('TABLE_NAME_GOES_HERE', RESEED, ZZZZZ);

其中,ZZZZ是重新设定种子的值。该值应至少比YYYY高一个。YMMV,所以选择一个适合您情况的值。

向我们展示tbl_claim_行和tbl_导入的完整表定义,包括任何键和/或约束以及任何触发器。此外,查看准确的错误消息文本也会有所帮助。表定义添加到原始帖子中。谢谢我会在这里发布错误消息。这是一个很长的机会,但你有任何触发表上?谢谢大家的帮助-我解决了这个问题。另一个用户创建了sql server代理作业,以根据外键fk_batch_control_组从tbl_claim_行删除记录。这与我无关——只是他每15分钟就有一次工作,尽管他的所有记录都不见了!他的工作的最后一步?…DBCC_checkidentbl_claim_line,RESEED,使用MAXpk值。这就是sql server突然插入重复密钥的原因!我正在失去理智。谢谢大家的意见。我错误地认为没有其他人会造成这个问题。工作。Gewd Lard.INT没有包装。目前大约在200万范围内。正如我所说的——如果我停止并启动正在进行循环的SSIS包,它可能会在突然尝试插入重复的标识值之前再插入50000条记录。顺便说一句,我是这个系统上唯一的用户。我总是使用long,因为我担心任何键索引可能会溢出。在我的世界里,九千五百万就足够了。