6

我必须使用 PHP 的 mysql_query() 函数更新 mysql 表。因此,我只需要在一个语句中发送以下 UPDATE 查询:

SET @i = 0;

UPDATE mytable SET id=(@i:=@i+1);

我已经阅读了一些示例,这些示例可以通过使用表别名的 SELECT 语句来完成,例如:

SELECT @rn:=@rn+1 AS rank, t1.* FROM (SELECT * FROM mytable) t1, (SELECT @rn:=0) t2

有什么方法可以将这些表别名与我需要使用的 UPDATE 语句一起使用?

编辑:

根据 Topher Hunt 的回答,我想我可以使用以下方法创建 mytable 的副本:

CREATE TABLE mytable_copy SELECT @rn:=@rn+1 AS id, t1.* FROM (SELECT * FROM mytable) t1, (SELECT @rn:=0) t2

然后 DROP mytable 并将 mytable_copy 重命名为 mytable。

此语句是否会创建 mytable 的精确副本,具有与 mytable 中的字段类型和长度相同的字段类型和长度?

4

2 回答 2

3

如果您在表之间使用 JOIN,则 SELECT 和 UPDATE 语句之间的语法非常相似。例子:

SELECT * 
FROM table1 a
    JOIN table2 b ON a.something = b.something ## (conditions for linking tables)
    JOIN table3 c ON b.something = c.something
WHERE a.something = 'value'

连接 3 个表的 SELECT 语句可以转换为 UPDATE 语句,只需删除 SELECT 行,将单词 FROM 更改为 UPDATE,并添加“SET”子句来说明您要更改的内容。像这样:

UPDATE table1 a
    JOIN table2 b ON a.something = b.something ## (conditions for linking tables)
    JOIN table3 c ON b.something = c.something
SET a.variable = 'value2', 
    b.something = 'value3',
    c.somethingelse = 'value4'
WHERE a.something = 'value';

如果需要,您可以同时更改多个字段;只需用逗号分隔每个 SET 项目。

于 2012-10-09T14:55:32.337 回答
0

为什么不直接删除此列并使用 auto_increment 添加一个新列作为主键?这将自动分配您需要的值。

ALTER TABLE mytable DROP COLUMN id;

ALTER TABLE mytable ADD ( id int AUTO_INCREMENT PRIMARY KEY );

-or- as you requested...

UPDATE mytable
  JOIN (SELECT @xxx := 0) AS v1 
   SET id = (@xxx := @xxx + 1)
;
于 2012-10-09T22:56:32.623 回答