【问题标题】:java spring error adding object in Databasejava spring 在数据库中添加对象时出错
【发布时间】:2015-07-10 05:05:37
【问题描述】:

我正在尝试在数据库中插入一行,但保存对象时出现此错误:

原因:com.microsoft.sqlserver.jdbc.SQLServerException: Violation UNIQUE KEY 约束“SITE_NAME_UNIQUE”。不能插入重复 键入对象“dbo.SITE”。重复键值为 (114, TEST30042015SITEREQUEST)。

但该值在数据库中不存在。 有人有想法吗?

创建表 dbo.site 的脚本,由 sql server 管理生成

CREATE TABLE [dbo].[SITE](
[SITE_ID] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[SITE_BUSINESS_ID] [bigint] NOT NULL,
[SITE_STATUS_ID] [bigint] NOT NULL,
[SITE_COUNTRY_ID] [bigint] NOT NULL,
[SITE_NAME] [varchar](40) NOT NULL,
[SITE_ADDRESS] [varchar](250) NULL,
[SITE_LOCAL_IT] [bigint] NULL,
[SITE_RIF] [bigint] NULL,
[SITE_USER_NUMBER] [bigint] NULL,
[SITE_LOCAL_IT_PHONE] [varchar](20) NULL,
[SITE_SUBNET] [varchar](30) NOT NULL,
[SITE_ANALOG_PHONE_NUMBER] [varchar](20) NULL,
[SITE_COMMENT] [varchar](400) NULL,
[SITE_ENTITY_CODE] [bigint] NOT NULL,
[SITE_INVOICE_CODE] [bigint] NOT NULL,
[SITE_LOCAL_CONTACT] [bigint] NULL,
[SITE_END_DATE] [datetime] NULL,
 CONSTRAINT [SITE_PK] PRIMARY KEY CLUSTERED 
(
[SITE_ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [SITE_NAME_UNIQUE] UNIQUE NONCLUSTERED 
(
[SITE_COUNTRY_ID] ASC,
[SITE_NAME] 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].[SITE]  WITH CHECK ADD  CONSTRAINT [SITE_BUSINESS_FK] FOREIGN KEY([SITE_BUSINESS_ID])
 REFERENCES [dbo].[BUSINESS] ([BUS_ID])
GO

ALTER TABLE [dbo].[SITE] CHECK CONSTRAINT [SITE_BUSINESS_FK]
GO

ALTER TABLE [dbo].[SITE]  WITH CHECK ADD  CONSTRAINT [SITE_COUNTRY_FK] FOREIGN KEY([SITE_COUNTRY_ID])
REFERENCES [dbo].[COUNTRY] ([CTRY_ID])
GO

ALTER TABLE [dbo].[SITE] CHECK CONSTRAINT [SITE_COUNTRY_FK]
GO

ALTER TABLE [dbo].[SITE]  WITH CHECK ADD  CONSTRAINT [SITE_STATUS_FK] FOREIGN KEY([SITE_STATUS_ID])
REFERENCES [dbo].[STATUS] ([STA_ID])
GO

ALTER TABLE [dbo].[SITE] CHECK CONSTRAINT [SITE_STATUS_FK]
GO

ALTER TABLE [dbo].[SITE]  WITH CHECK ADD  CONSTRAINT [SITE_USER_2_FK] FOREIGN KEY([SITE_RIF])
REFERENCES [dbo].[USERS] ([USER_ID])
GO

ALTER TABLE [dbo].[SITE] CHECK CONSTRAINT [SITE_USER_2_FK]
GO

ALTER TABLE [dbo].[SITE]  WITH CHECK ADD  CONSTRAINT [SITE_USER_3_FK] FOREIGN KEY([SITE_LOCAL_CONTACT])
REFERENCES [dbo].[USERS] ([USER_ID])
GO

ALTER TABLE [dbo].[SITE] CHECK CONSTRAINT [SITE_USER_3_FK]
GO

ALTER TABLE [dbo].[SITE]  WITH CHECK ADD  CONSTRAINT [SITE_USER_FK] FOREIGN KEY([SITE_LOCAL_IT])
REFERENCES [dbo].[USERS] ([USER_ID])
GO

ALTER TABLE [dbo].[SITE] CHECK CONSTRAINT [SITE_USER_FK]
GO

这个函数将我的对象添加到数据库中:

@Override
public void saveSite(ISite siteObj){
    Assert.notNull(siteObj);
    merge((Site) siteObj);
}

【问题讨论】:

  • 由于错误提示表中已经存在一个与您尝试插入的名称相同的站点
  • 或者您尝试使用相同的键插入 2 行
  • 请为 dbo.SITE 表添加创建脚本,或者至少说明 SITE_NAME_UNIQUE 中包含哪些列。
  • @Aツ 是,但该值在数据库中不存在,key 是自动生成的,最后一个 id 正常
  • 请为我们提供一个 ddl 和任何插入表格的代码

标签: java sql spring jdbc


【解决方案1】:

您对 [SITE_COUNTRY_ID] 和 [SITE_NAME]。

您正在尝试插入 SITE_NAME 为“TEST30042015SITEREQUEST”且 SITE_COUNTRY_ID 为 114 的行,而该行已经存在

您正在尝试以违反此约束的方式更新现有行。

【讨论】:

  • 我没有任何相同的行。事实上,我想做一个插入。在春天,我与一个新站点合并,它通常应该在数据库中插入一个新行。当我在数据库中手动进行插入或合并时,它正在工作
  • 我尝试保存两次站点。一次是我直接调用站点的 dao save 函数,另一次是我调用包含该站点的另一个对象的 dao save 函数
猜你喜欢
  • 1970-01-01
  • 2021-07-20
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多