tôi đã cố gắngsqlquery một tên giữ chỗ nhiều lần
QSqlQuery query;
query.prepare("DELETE FROM names WHERE id_col = :ID OR id_parent = :ID");
query.bindValue(":ID", idVal);
query.exec();
giả định rằng idVal sẽ được binded hai lần, nhưng thực hiện truy vấn này chỉ hàng với id_parent = idVal bị xóa, với id_col = idVal vẫn xóa được. Vì vậy, chỉ có idVal thời gian thứ hai được liên kết với truy vấn.
Khi tôi viết lại nó để
QSqlQuery query;
query.prepare("DELETE FROM names WHERE id_col = ? OR id_parent = ?");
query.bindValue(0, idVal);
query.bindValue(1, idVal);
query.exec();
tất cả mọi thứ đã làm việc như mong đợi.
Đây có phải là cách để sử dụng một trình giữ chỗ được đặt tên nhiều lần trong QSqlQuery không?
** Lưu ý phụ: ** Điều này không trả lời cho bạn câu hỏi, nhưng bạn có thể 'THAM GIA 'bằng cách xóa và chỉ sử dụng một trình giữ chỗ. Một cái gì đó như: 'DELETE n FROM tên n INNER JOIN tên p ON p.id_col = n.id_parent WHERE id_col =: ID'. –
Đối với hậu thế, tôi tìm thấy một hack cho một vấn đề liên quan khi bạn đang làm _select_ báo cáo. Sử dụng ['with clause'] (https://www.sqlite.org/lang_with.html) như sau:' with my_id as (values (: id)) chọn * từ tên id = (select * from my_id) hoặc parent_id = (chọn * từ my_id) ' –
* ngớ ngẩn *: Ràng buộc này được loại bỏ trong qt 5, do đó, các giải pháp thay thế chỉ cần thiết trước qt 5. –