最近自己做了一个购物车
其中购物车表如下:
CREATE TABLE `cart` (
  `id`     INT           NOT NULL  AUTO_INCREMENT,
  `cart_id`     CHAR(32)      NOT NULL,
  `goods_id`  INT           NOT NULL,
  `quantity`    INT           NOT NULL,
  `added_on`    DATETIME      NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;由于考虑到确保主键id在无论何种情况下保持唯一值,所以写插入语句的时候,为id指定的值是UUID()
但是结果在测试的时候,动不动就报主键冲突的错误:
//Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY'
没有任何规律可循于是暂时不用UUID(),让id自增(不知道理论上有没有可能出现主键冲突,比如正巧都在这一瞬间同时加入购物车...理论上,有可能吗?)这是第一个问题.第二个问题:
加入购物车进行付款的时候,实际上是删除购物车里面的订单,并把订单加入到order表,cart表每天要做数不清的add update delete操作,那cart表的id不是越变越大,这个会有什么隐患吗?请大家帮忙解答一下,或者有成熟的做法,请指教谢谢!

解决方案 »

  1.   

    第一个问题
    不存在你的这个担忧。因为只有主键才能自增,而主键就必须唯一。这也就是你 UUID() 插入失败的原因第二个问题
    当 id 越来越大,直至超越 id 字段所能允许的范围时,将产生主键冲突的错误。
    你需要定时重构 id 的初值
      

  2.   

    主要是看楼主的第二个问题。个人觉得既然有无数的add ,update ,delete 是否可以考虑减轻数据库的压力,考虑使用别的方式来完成购物车的信息收集过程
      

  3.   

    可以写个事件 truncate cart 一般可以在某个时间点(没有人访问的时间) 自己看情况来清空它