【问题标题】:MySQL UPDATE AND INSERT StatementMySQL UPDATE AND INSERT 语句
【发布时间】:2023-03-31 02:15:01
【问题描述】:

目前有一些数据输入不正确,我基本上需要运行一个模式来更新当前记录并插入一个新记录(如果可能,在一个语句中)。表是这样设置的:

  cityID            int(10)
  stateID           smallint(5)
  orderEnterpriseID int(10)
  isDefault         tinyint(3)
  locationType      tinying(2)

现在,每条记录的 locationType 都为 0,我需要将其更新为 5:

更新
table SET
table.locationType = 5 在哪里table.locationType = 0 AND table.orderFromEnterprise = 0;

但我还需要使用重复数据创建另一条记录并将 locationType 设置为 6。我在处理其中一些 SQL 语句时遇到问题,非常感谢任何帮助!!!!

【问题讨论】:

  • 为什么不在2里做呢?先插入,再更新?
  • 在哪里创建重复记录?在同一张桌子上?
  • 我认为您真正要寻找的是一笔交易,而不是一条声明。您不能将其作为一个声明。
  • @Jeff Ferland 是的,我同意,如果有任何交易可以达到目的,我的回答中也指出了这一点。

标签: mysql insert insert-update


【解决方案1】:

首先按照您的描述执行更新:

UPDATE
table SET
table.locationType = 5 WHERE table.locationType = 0 AND table.orderFromEnterprise = 0;

然后复制所有记录并在插入时将它们分配为 6 作为位置类型,记住将记录限制为 locationType = 5,以确保不会复制新添加的记录(不确定这是否是一个问题mysql 但只是为了确定):

INSERT INTO table 
(cityID, stateID, orderEnterpriseID, isDefault, locationType) 
SELECT t1.cityID, t1.stateID, t1.orderEnterpriseID, t1.isDefault, 6 
FROM table as t1
WHERE t1.locationType = 5

它不在一个语句中,但它会完成工作,如果您担心不一致,那么只需 围绕这两个操作包装一个 transaction

【讨论】:

    【解决方案2】:

    您不能在 UPDATE 语句中执行此操作,更新只会更新表中已有的内容。

    如果您想复制更改一个字段的条目,您可以执行以下操作:

    INSERT table_name (cityID, stateID , orderEnterpriseID, isDefault, locationType)
    SELECT cityID, stateID , orderEnterpriseID, isDefault, 6
    FROM table_name
    

    (请注意,所有这些都作为一个语句执行) 另请注意,我们从表中选择 6 而不是 locationType。

    我们在这里所做的只是选择表格中的所有内容,将位置类型替换为 6,然后将其插入回表格中。

    【讨论】:

    • 我建议使用 where 子句限制选择,以消除由于您将行插入同一个表中可能出现的任何混淆,不确定服务器会做什么,我实际上希望它继续处理新插入的行,但是当插入开始时查询执行也可能已经完成,不确定mysql如何处理,因此最好限制选择;)
    • 在发布之前我已经检查过了,一切正常。如果这种竞争条件是可能的,那么这些类型的语句根本不会出现在 sql 中。我什至不确定是否可以通过发出 sql 查询来创建竞争条件。
    • 不是说没有,只是更愿意始终保持安全;)
    【解决方案3】:

    我认为不可能在单个查询中执行此操作。但是,您可以插入重复的行并将 locationType 设置为 6,然后将 locationTypes 的 0 更新为 5。以下是查询:

    insert into table (cityID, stateID, orderEnterpriseID, isDefault, locationType)
    select cityID, stateID, orderEnterpriseID, isDefault, 6
    from table
    where locationType = 0 and orderEnterpriseID = 0;
    
    # now your update query
    update table
    set locationType = 5
    where locationType = 0 and orderEnterpriseID = 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 2012-11-25
      • 2011-12-04
      • 2016-02-24
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多