DROP TABLE IF EXISTS T;
CREATE TABLE T (NAME VARCHAR(10),EMAIL VARCHAR(20));
INSERT INTO T VALUES('ABC','abc@gmail.com'),('ABCD','abcd@gmial.com');
ALTER TABLE T
ADD COLUMN ID INT FIRST;
UPDATE T JOIN(
SELECT NAME, ROW_NUMBER() OVER (ORDER BY NAME DESC) RN FROM T) s
ON S.NAME = T.NAME
SET T.ID = S.RN
;
ALTER TABLE T
MODIFY COLUMN ID INT AUTO_INCREMENT PRIMARY KEY;
SELECT * FROM T;
其中添加id,然后使用带有order by的行号更新现有记录 有了这个结果
+----+------+----------------+
| ID | NAME | EMAIL |
+----+------+----------------+
| 1 | ABCD | abcd@gmial.com |
| 2 | ABC | abc@gmail.com |
+----+------+----------------+
2 rows in set (0.00 sec)
2条答案
按热度按时间3b6akqbq1#
你可以写:
5hcedyr02#
ALTERTABLE不允许您对新字段进行排序,因此您可能需要分两个阶段进行排序。例如
其中添加id,然后使用带有order by的行号更新现有记录
有了这个结果
第二个alter语句然后修改id。
如果您不在MySQLversion8或更高版本上,则需要使用使用变量的行号模拟来替换行号位。无论如何,这并没有什么区别,因为任何查询仍然需要包含order by才能获得所需的结果。