[英]Hibernate transaction validation / Object priority
想象以下情况:
一个带有主题的表,其前身链接到相同的表/对象:
|ID | PREDECESSOR | DESCRIPTION |
+---+-------------+-------------|
| 1 | NULL | Topic 1 |
| 2 | 1 | Topic 2 |
| 3 | 2 | Topic 3 |
列的前身具有唯一的约束,因为一个主题只能是一个主题的前身。
现在,我们在应用程序中删除主题2。 为此,我们必须反对:
|ID | PREDECESSOR | DESCRIPTION |
+---+-------------+-------------|
| 2 | 1 | Topic 2 -> deleted
| 3 | 1 | Topic 3 -> new predecessor, because 2 was deleted
现在,我们将这些对象保存在一个事务中:
....
PersistentTransaction trans = session.beginTransaction();
session.saveOrUpdate(object topic 3);
session.delete(object topic 2); //object order does not matter
trans.commit();
休眠日志:
Hibernate:
update
TOPIC
set
.....
如您所见,很遗憾,在删除主题2之前调用了主题3的更新,导致
SqlException "Duplicate entry '1' for key 'UNIQUE_CONSTRAINT_NAME'
这个例外很明显,但是如果顺序为“删除主题2”,然后再“更新主题3”,则一切正常。
为什么在交易中间检查此约束? 在我看来,整个交易应该是有效的,并且验证应该在交易结束时进行。 我没有意识到吗?
可以在许多其他情况下重新创建此优先级问题,因此很显然,没有严格的顺序,例如“先删除,然后修改等...”。 还是在数据库中进行调整? 有人可以帮我这个忙吗?
休眠4.2.4; MariaDb 10.1.25
错误代码:1062。键%d的条目“%s”重复
例:
错误代码:1062。键“ PRIMARY”的条目“ 1”重复
情况1:重复的值。
您要插入的数据已存在于列主键中。 主键列是唯一的,它将不接受重复的条目。
情况2:唯一数据字段。
您试图将一列添加到包含数据的现有表中并将其设置为唯一。
情况3:数据类型-上限。
auto_increment字段已达到其最大范围。
情况1:重复的值。
将主键列设置为AUTO_INCREMENT。
ALTER TABLE ‘table_name’ ADD ‘column_name’ INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
现在,当您尝试插入值时,请忽略主键列。 您也可以在主键列中插入NULL值以生成序列号。 如果未指定任何值,MySQL将自动分配序列号。
情况2:唯一数据字段。
创建新列而不将其分配为唯一字段,然后插入数据,现在将其设置为唯一字段。 现在可以使用了!!!
情况3:数据类型上限。
例如,当数据类型达到上限时,如果您将主键列分配为TINYINT,则最后一条记录的ID为127,插入新记录时,ID应为128。但是128不在其中TINYINT的范围,因此MySQL会将其减小到有效范围内,并尝试将其插入ID为127,因此会产生重复的键错误。
为了解决这个问题,您可以更改索引字段,根据需要将其设置为有符号/无符号INT / BIGINT,以便最大范围增加。 您可以使用以下命令来做到这一点:
ALTER TABLE ‘table_name’ MODIFY ‘column_name’ INT UNSIGNED NOT NULL AUTO_INCREMENT;
您可以使用以下函数来检索最近自动生成的AUTO_INCREMENT值:
mysql> SELECT LAST_INSERT_ID();
在应用了上述所有解决方案之后,如果仍然遇到此错误代码:1062重复输入错误,则可以尝试以下解决方法。
步骤1:备份资料库:
您可以使用以下命令备份数据库:
mysqldump database_name> database_name.sql
步骤2:删除并重新创建数据库:
使用以下命令删除数据库:
DROP DATABASE database_name;
使用以下命令创建数据库:
CREATE DATABASE database_name;
步骤3:导入数据库:
您可以使用以下命令导入数据库:
mysql database_name < database_name.sql;
应用此替代方法后,将解决重复输入错误。 希望本文能帮助您理解和解决MySQL错误代码:1062。重复输入错误。 如果仍然遇到此问题,可以通过“与我联系”页面与我联系。 我可以帮助您解决此问题。
资源链接: http : //www.rathishkumar.in/2016/01/how-to-solve-mysql-error-code-1062.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.