【问题标题】:Update prices in mysql更新mysql中的价格
【发布时间】:2015-06-10 13:54:12
【问题描述】:

这是我的文章表的样子:(tbl_articles)

ID | SHORT_DESCRIPTION | DESCRIPTION    | GROSS | NET
1  | v00556            | valve washroom | 9.00  | 7.49

等等

我的供应商以这种格式 (tbl_supplier) 向我提供了一个新的价目表

SHORT_DESCRIPTION | DESCRIPTION    | GROSS | NET
v0056             | valve washroom | 9.50  | 7.99

如何用他的价格更新我的价目表?我们有共同的简短描述栏,但他也有新文章。两个列表都包含超过 10,000 篇文章,导出到 excel + 垂直搜索不起作用。

我试过了,但没有成功:

UPDATE 
    tbl_articles
SET 
    Gross = 
    (
        SELECT 
            Gross 
        FROM 
            tbl_supplier 
        WHERE 
            tbl_articles.SHORT_DESCRIPTION = tbl_supplier.SHORT_DESCRIPTION
    )

缺点:

  • 新产品未添加到我的表中
  • 无法更新 2 个字段

【问题讨论】:

  • tbl_articles 表在SHORT_DESCRIPTION 上是否有唯一索引?您将需要一个能够插入和更新现有记录而无需更复杂的代码逻辑。
  • 如果您在简短描述中有唯一索引,请执行insert ... on duplicate key update
  • 是的,所有的 short_description 都是独一无二的!
  • 这些值是唯一的,但您能确认该列实际上有一个唯一索引来强制执行吗?
  • @Dimi 你能说得更具体点吗?

标签: mysql sql sql-update sql-insert


【解决方案1】:

short_description上创建唯一索引:

create unique index idx_articles_shortdesc on articles(short_description);

然后使用insert . . . on duplicate key update:

insert into tbl_articles(SHORT_DESCRIPTION, DESCRIPTION, GROSS, NET)
    select s.SHORT_DESCRIPTION, s.DESCRIPTION, s.GROSS, s.NET
    from tbl_supplier s
    on duplicate key update gross = values(gross), net = values(net);

您没有指定要更新描述,因此不包括在内。

作为注释。您可能想要调查缓慢变化的维度表。我认为更好的结构会为每个定价设置一个生效日期和结束日期。这使您可以保留价格变化的历史记录。另外,我会记录创建记录的日期,以便了解产品的推出时间。

【讨论】:

    【解决方案2】:

    假设SHORT_DESCRIPTION 字段是表中的实际主字段/唯一字段,最简单的做法是使用带有on duplicate key update 子句的insert 语句:

    INSERT INTO tbl_articles 
    (short_description, description, gross, net) -- Assumes ID is autogenerated
    SELECT short_description, description, gross, net
    FROM   tbl_supplier
    ON DUPLICATE KEY UPDATE gross = VALUES(gross), net = VALUES(net)
    

    【讨论】:

      【解决方案3】:

      您可以使用带有连接的 UPDATE 查询:

      UPDATE
        tbl_articles a INNER JOIN tbl_supplier s
        ON a.short_description = s.short_description
      SET
        a.gross=s.gross,
        a.net=s.net
      

      【讨论】:

        猜你喜欢
        • 2018-01-31
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-19
        相关资源
        最近更新 更多