0

仅在一个UPDATE查询中,是否可以SET基于 SQL 查询结果获取值?

这是我想到的不起作用的查询:

UPDATE items SET itemcode=CONCAT('XYZ',(SELECT COUNT(*) as ctr FROM items
       WHERE itemcode!=''),'GZ') WHERE itemid=123;

这不是实际查询,但使用一个查询的目的是在我尝试运行两个连续查询时防止出现竞争条件。

items表中插入记录后,我需要更新一些创建的项目并输入一个递增的项目代码。所以这取决于表中带有空的项目的数量itemcode

4

3 回答 3

2

要正确避免竞争条件,您可以使用LOCK TABLE和事务以确保结果一致。

在您的查询中

UPDATE items SET itemcode=CONCAT('XYZ',(SELECT COUNT(*) as ctr FROM items
   WHERE itemcode!=''),'GZ') WHERE itemid=123;

您正在选择具有给定属性的记录items

SELECT COUNT(*) as ctr FROM items WHERE itemcode!=''

然后将 123 与 XYZGZ 相关itemcodeitemid

您也可以使用UPDATE JOINbetween itemsand来做到这一点ctr

UPDATE items JOIN ( 
   SELECT CONCAT('XYZ', COUNT(*), 'GZ') AS newcode FROM items
       WHERE itemcode!='') AS dummy
SET itemcode = dummy.newcode WHERE itemid = 123;

或者在 MySQL 中(并使用 LOCK TABLES),您可以SELECT将计数计入一个临时变量,然后分配itemcode给该变量:

mysql> CREATE TABLE items ( itemid integer, itemcode varchar(32) );
mysql> INSERT INTO items VALUES ( 1, 'one' ), ( 2, 'two' ), ( 123, 'and 123');
mysql> LOCK TABLE items WRITE;
mysql> BEGIN WORK;
mysql> SELECT COUNT(*) INTO @x FROM items WHERE itemcode != '';
mysql> UPDATE items SET itemcode=CONCAT('XYZ',@x,'GZ') WHERE itemid = 123;
mysql> COMMIT WORK;
mysql> UNLOCK TABLES;


mysql> SELECT * FROM items;
+--------+----------+
| itemid | itemcode |
+--------+----------+
|      1 | one      |
|      2 | two      |
|    123 | XYZ3GZ   |
+--------+----------+
3 rows in set (0.00 sec)

一种更短的方法,无需显式锁定:

mysql> BEGIN WORK;
mysql> SELECT COUNT(*) INTO @x FROM items WHERE itemcode != '' FOR UPDATE;
mysql> UPDATE items SET itemcode=CONCAT('XYZ',@x,'GZ') WHERE itemid = 123;
mysql> COMMIT WORK;
于 2013-10-19T17:20:01.523 回答
0

找到了答案!

子查询不应该在SET部件内,因为我试图访问同一个表。问题中的查询返回以下错误:

#1093 – You can’t specify target table ‘items’ for update in FROM clause.

解决方案:

UPDATE items,(SELECT COUNT(*) as ctr FROM items WHERE itemcode!='') temp
        SET itemcode=CONCAT('XYZ',temp.ctr+1,'GZ') WHERE itemid=123;

来源:http: //7php.com/mysql-update-select-statement-1093/

于 2013-10-19T17:19:36.880 回答
0

这是您可能希望在这种情况下使用的查询示例:

UPDATE
    Table AS t
    LEFT JOIN (
        SELECT
            Index1,
            Index2,
            COUNT(EventType) AS NumEvents
        FROM
            MEvents
        WHERE
            EventType = 'A' OR EventType = 'B'
        GROUP BY
            Index1,
            Index2
    ) AS m ON
        m.Index1 = t.Index1 AND
        m.Index2 = t.Index2
SET
    t.SpecialEventCount = m.NumEvents
WHERE
    t.SpecialEventCount IS NULL

它最初是由@Hammerite在这里发布的。

于 2013-10-19T17:15:10.140 回答