mysql 互换两行_MySql通过update语句交换两行记录非唯一的属性

MySql通过update语句交换两行记录非唯一的属性

现有表student,定义如下。

CREATE TABLE `student` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `date` datetime DEFAULT NULL, PRIMARY KEY (`Id`), KEY `id_date` (`date`) ) ENGINE=InnoDB AUTO_INCREMENT=11002 DEFAULT CHARSET=latin1;

Id date

2 2015-08-26 00:20:32

4 2018-08-26 00:20:32

现在希望将Id=2,Id=4的两条记录中的date进行交换,接着执行下面的查询。

SELECT * FROM student AS S1 JOIN student AS S2 ON S1.id = 4 AND S2.Id = 2 OR S1.id = 2 AND S2.Id = 4;

执行后得到结果。

id date id1 date1

4 2016-08-26 00:20:32 2 2015-08-26 00:20:32

2 2015-08-26 00:20:32 4 2016-08-26 00:20:32

可以看到要完成交换,只需要将左表和右中的date进行交换,就可以完成两条记录中的date属性值的交换。

查询mysql 手册update定义。

UPDATE [LOW_PRIORITY] [IGNORE] table_reference

SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] …

[WHERE where_condition]

[ORDER BY …]

[LIMIT row_count]

table_reference table_references and where_condition are specified as

described in Section 13.2.9, “SELECT Syntax”.

可以看到table_reference与select中的描述一致,因此在update中可以使用join。

接着将上面的select 改写为update。

UPDATE student AS S1 JOIN student AS S2 ON ( S1.id = 4 AND S2.Id = 2 OR S1.id = 2 AND S2.Id = 4 ) SET S1.date = S2.date;

执行后id = 2,id = 4的两条记录中的完成交换。

上述update语句还可以改写为下面的形式。

UPDATE student AS S1 JOIN student AS S2 ON (S1.id = 4 AND S2.Id = 2) SET S1.date = S2.date, S2.date = S1.date;

注意如果所交换的属性加了唯一索引,那么交换无法完成。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值