Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql&;需要php指南:)_Php_Mysql - Fatal编程技术网

Mysql&;需要php指南:)

Mysql&;需要php指南:),php,mysql,Php,Mysql,我正在学习PHP和Mysql,并提出了一个小示例项目。在这个项目中,我可以注册一张发票,我可以向其中添加一些项目,最后但并非最不重要的是,我可以将这些项目移动到正确的商店的存储中。就我现在所见,当我想将发票\u项目移动到存储表时,我必须对每个项目进行查询,以检查该项目是否存在于该存储中,然后更新该行的数量记录或插入新行 在我看来,这不是一个好的解决办法。难道我没有办法用一个mysql查询来解决这个问题吗?它是否是这个任务的合适的数据库基础设施?如果不是,我如何改进它 非常感谢您的建议 发票 I

我正在学习PHP和Mysql,并提出了一个小示例项目。在这个项目中,我可以注册一张发票,我可以向其中添加一些项目,最后但并非最不重要的是,我可以将这些项目移动到正确的商店的存储中。就我现在所见,当我想将
发票\u项目
移动到
存储
表时,我必须对每个项目进行查询,以检查该项目是否存在于该存储中,然后更新该行的数量记录或插入新行

在我看来,这不是一个好的解决办法。难道我没有办法用一个mysql查询来解决这个问题吗?它是否是这个任务的合适的数据库基础设施?如果不是,我如何改进它

非常感谢您的建议

发票

  • ID(主键)
  • 发票号码
  • 商店标识
Inovice_项目

  • ID(主键)
  • 发票号
  • 项目
  • 数量
储藏

  • ID(主键)
  • 项目编号
  • 数量
  • 商店标识
项目

  • ID(主键)
  • 名字
贮藏

  • ID(主键)
  • 名字
就我现在所见,当我想将发票项目移动到存储表时,我必须对每个项目进行查询,以检查该项目是否存在于该存储中,然后更新该行的数量记录或插入新行

您可以更改您的表结构。目前,您已经将
主键
添加到IDs中,但也可以使用
UNIQUE
。如果数据库中已经存在数据,这将导致更新查询失败。换句话说,通过设置一个列unique,数据库将为您执行exist检查,您不必在PHP中编写check-if-id-ready-exists-then-update-or-insert()函数


您也可以在您的ID上使用
自动增量
。这样,当您插入新项目时,ID会自动递增。

只需在两个查询中执行此操作

  • 更新已经存在的计数
  • 插入任何新项目
  • 问题1: 问题2:
    只需在重复密钥更新时使用复合唯一密钥和
    即可进行一个同时具有这两种功能的查询?@scragar感谢您的回答,我可以如何使用复合唯一密钥?您目前的操作情况如何?请包括代码
    UPDATE
        s
    SET
        s.quantity = s.quantity + item.quantity
    FROM
        Storage s
        JOIN Invoice_item item ON s.item_id = item.item_id
    WHERE
        item.invoice_id = 5 -- invoice to put into storage
        AND s.ID = 3 -- store to put the invoice items into
    
    INSERT INTO
        Storage (item_id, quantity, store_id)
    SELECT
        item.item_id
        ,item.quantity
        ,3 -- store to put the invoice items into
    FROM
        Invoice_item item
    WHERE
        item.invoice_id = 5
        AND NOT EXISTS (
            SELECT *
            FROM Storage s
            WHERE
                s.store_id = 3
                AND s.item_id = item.item_id
        )