如何使用MYSQL UPDATE的表别名

时间:2012-10-09 14:47:32

标签: php mysql

我必须使用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和RENAME mytable_copy到mytable。

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

2 个答案:

答案 0 :(得分: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项目。

答案 1 :(得分: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)
;