我有一个带有唯一字段'addr'的表'EMAIL'。当我从mysql控制台(通过Putty)进行查询时,它返回'。0行受影响'(因为'id'实际上没有改变),但FIREDAC总是返回 rowsAffected=1 (如果字段较多,则为2或3)。为什么会这样,如何解决?
+----+-------+------+------+
| id | owner | addr | pass |
+----+-------+------+------+
| 1 | NULL | test | NULL |
+----+-------+------+------+
mysql> update EMAIL set id=last_insert_id(id);
Query OK, 0 rows affected (0.00 sec) // 0 affected!
Rows matched: 1 Changed: 0 Warnings: 0
FIREDAC (FDconnection + FDquery)
procedure test;
var conn:TFDCONNECTION;
query:TFDQUERY;
begin;
conn:=TFDCONNECTION.Create(nil);
query:=TFDQUERY.Create(nil);
query.Connection:=conn;
conn.Params.Add('DriverID=MySQL');
conn.Params.Add('CharacterSet=utf8');
conn.Params.Add('Server=192.168.56.11'); //ubuntu server, v 14.14 5.7.30
conn.Params.Add('User_Name=root');
conn.Params.Add('Password=mypass');
conn.Params.Add('Database=MYDB');
conn.Params.Add('Port=3306');
query.SQL.Text:='update EMAIL set id=last_insert_id(id)';
query.ExecSQL;
//never shows '0', always thinks all the rows have been updated!
showmessage(inttostr( query.RowsAffected ));
query.Close;
conn.Free;
query.Free;
end;
[已解决!]我编辑了'FireDAC.Phys.MySQL'的源代码,第471行,注释了'CLIENT_FOUND_ROWS'标志(感谢@Olivier)。
对于一个MySQL数据库,在这样的情况下 UPDATE
查询,受影响的行数(由 mysql_affected_rows())取决于 CLIENT_FOUND_ROWS
标志,如果该标志被禁用,则只考虑实际被修改的记录。
如果该标志被禁用,那么只有实际被修改的记录才会被考虑在内,如果该标志被启用,那么所有处理过的记录(无论是否被修改)都会被考虑在内。
如果启用该标志,那么所有处理过的记录(无论是否修改)都会被考虑在内。
默认情况下。CLIENT_FOUND_ROWS
是禁用的,但FireDAC在调用 mysql_real_connect().