SQLSTATE[23000]主键重复

1、表操作简介
批量更新的时候需要对w_table_1和w_table_2两个表做写操作,所以,在代码中使用事务操作,对这两个表做一致性处理。
因为使用事务做一致性处理,所以,在实行事务之前,认为这两个表的数据是一致的。

2、一致性校验条件
需要对于w_table_1表和w_table_2表的某些属性值作为参照,用于数据一致性校验的条件。
w_table_1表:更新的数据条目。(需要对w_table_1表的相应的car_id数据的inspection_status字段更新)在在yii框架中,只用AR的updateall方法更新数据库的时候,返回更新成功的条目数,就选用更新条目数作为一致性判断的条件。

w_table_2表:将相应的car的年检信息插入该表的数量。(由于事务的一致性保证,默认情况下,在w_table_1表获得更新的car_id的完整的年检数据在w_table_2表是没有记录的)

3、数据更新保存失败描述

发现对同一组car_id进行批量安排年检总是失败,而且失败的car_id是一定的

4、原因阐述
由于我们使用事务保证数据一致性,所以默认w_table_1表和w_table_2表的数据是一致的。也就是说w_table_1表更新的数据条目数和w_table_2表新插入的数据数量是相等的。

但是,测试的过程中,测试人员在生成需要的数据时候只是对w_table_1表的数据进行还原,没有将w_car_inspection表的相应数据删除,所以,导致在插入w_table_2表的时候出现CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘5354-2016-06-06 11:43:31’ for key ‘car_id_inspection_time’,

经过查询,23000状态码代表插入数据主键重复。

经过分析,这是因为测试人员只是手动还原了w_table_1表的数据,对w_table_2表的数据没有还原的原因。

5、改进的方法
1、测试过程中注意还原数据的合理性
需要对w_table_1表的数据的inspection_time(改成在w_table_2表中car_id和inspection_time两个字段租成的联合主键不一样的时间)和inspection_status(改成9)两个字段做修改,为了防止在插入w_table_2表数据的时候造成car_id_inspection_time联合主键重复。

2、修改一致性校验的条件。

Leave a Comment

电子邮件地址不会被公开。 必填项已用*标注