首页 » 数据库

主键的值重复 Duplicate entry '4294967295' for key 'PRIMARY'

   发表于:数据库评论 (0)   热度:3377

今天erp调用商城的商品推送接口, 给商城推送商品

(推送提交的参数如下)

{
    "products": [
        {
            "createTime": "2018-02-07 12:04:07",
            "name": "文和测试",
            "productCode": "8294967296",
            "productId": 8294967296,
        }
    ]
}

结果返回错误  “主键的值重复”

Duplicate entry '4294967295' for key 'PRIMARY'

一查数据库发现 是 product_id的长度超了 ,数据库里的  product_id 字段设置的都是  自增 int 类型的, product表里的  product_id 自增的值已经到了  4294967295 了到了最大值了,  而  product_id 等于 8294967296 超过了int  的长度 所以提示   “主键的值重复”。

插个队

  1. int(11) 和int(3) 存储的值的最终大小是一样的,这个3和11 是在终端显示的时候数字长度,和存储数字大小和长度无关

  2. 11万的数据,主键应该不是步长加1,或者id也可能不是自增0开始的。

  3. 主键的值重复,那就先去数据库找找这条记录,然后再看看 10多万的数据,怎么主键到了4294967295

  4. 2的32次方=4294967296(无符号),带符号再除以2,负数比正数多一个,-2147483648~+2147483647 int型无符号 4294967296 最大值

erp的同学说 erp里的product_id都是10多位数的,  商城还得改一下 product_id的数据类型,得改成  bigint,去数据库里搜了一下发现有 50多个表都有 字段 product_id ,这要是一个一个的改, 那麻烦了

甭愁有简便的办法 ,  写个sql 来生成 alter 语句 

select concat('alter table ', table_name, ' modify ', column_name, ' bigint') from information_schema.columns where table_schema = 'shop_ceshi' and column_name = 'product_id';

执行结果:

alter table shop_product modify product_id bigint ;
alter table shop_product_attr_index modify product_id bigint;
#......
alter table shop_product_browse modify product_id bigint;

然后复制执行结果, 执行, 成功,咋样这简便不

(。・v・。)
喜欢这篇文章吗?欢迎分享到你的微博、QQ群,并关注我们的微博,谢谢支持。