代码之家  ›  专栏  ›  技术社区  ›  Chris Sobolewski

mysql/php更新行是否存在,否则当要检查的列不唯一时插入

  •  0
  • Chris Sobolewski  · 技术社区  · 16 年前

    我已经阅读过关于替换和插入重复键查询的内容,虽然我可以看到它们有多有用,但它们似乎不适合我的目的。也许我的数据库设计与它的设计不符,但不管怎样,我希望我能让它工作起来。

    我正在尝试模拟一个在线商店来自学mysql和php,我正在记录一个会话ID,用于将个人的购物车拉回来进行个人访问,并尝试将库存写入购物车,我遇到问题的地方是试图检查该商品是否在购物车中。我希望每个项目对于每个用户都是唯一的,但是对于整个表来说它不应该是唯一的,否则这将阻止多个用户购买同一个项目,不是吗?

    到目前为止,我的桌子是这样的:

     | Cart ID(key) | USER_ID(fk) | ItemNum | ItemQTY |
    

    我基本上想看看用户的购物车中是否已经有了itemNum的itemQty>0。如果有,我希望itemqty更新到itemqty+,不管添加了多少,如果没有,则插入一行。

    为了做到这一点,我必须在写作之前查询一下吗?

    4 回复  |  直到 13 年前
        1
  •  1
  •   Lachlan McDonald    16 年前

    传统的购物车软件每个用户都有一个购物车,每次用户返回时都会恢复该购物车。因为你有两个 CartID 和A UserID 这给人的印象是,用户可以拥有多个购物车。

    然而,最好有三张桌子; Users , Carts 和; CartItems

    用户 需要一个 用户标识 , 手推车 将需要 卡蒂德 像是 OwnerID (引用) Users.UserID ) 卡特里姆 将有 卡蒂德 (引用) Carts.CartID ) ItemID Quantity .

    您甚至可以变得更简单,因为用户只有一个购物车,所以您可以完全忽略购物车表并替换 CartItems.CartID 具有 CartItems.OwnerID (引用) 用户标识 .

    我希望这有帮助。

        2
  •  2
  •   Ryan Florence    16 年前

    对于初学者…我想只运行查询来检查它是否在那里是可以的。然后,当您对PHP和MySQL比较熟悉时,开始构建您的知识。

    其他人可能不同意,但当我学习新语言时,我喜欢在我使它们“完美”之前让它们工作。

        3
  •  1
  •   RibaldEddie    16 年前

    您可以编写一个存储过程并使用该存储过程来处理插入。

    您需要学习如何编写存储过程并从PHP执行它们。

    此外,在存储过程中,您将需要执行多个查询,但对于您的应用程序来说,它看起来像对该过程的单个调用。

    Hth.

        4
  •  1
  •   Chris J    16 年前

    我认为您需要在cartid和itemnum上使用多列唯一键:

    alter table my_table add unique( CartID, ItemNumber );
    

    然后你可以做:

    insert into my_table values( 1, 'joe', 12345, 1 ) on duplicate key update ItemQTY = ItemQTY + 1;
    
    推荐文章