@balusC Я сделал, как вы писали. В моем случае я добавил данные cookie для повторного использования сеанса.
// get the cookie if need
String cookies = conn.getHeaderField("Set-Cookie");
// open the new connnection again
conn = (HttpURLConnection) new URL(newUrl).openConnection();
conn.setRequestProperty("Cookie", cookies);
Обновление: Этот ответ касается общей классификации ошибок. Для более определенного ответа о том, как лучше всего обработать точный запрос OP, см. другие ответы на этот вопрос
MySQL In, Вы не можете изменить ту же таблицу, которую Вы используете в ИЗБРАННОЙ части.
Это поведение документируется в: http://dev.mysql.com/doc/refman/5.6/en/update.html
, Возможно, можно просто соединить таблицу с собой
, Если логика достаточно проста изменить запрос, потерять подзапрос и соединить таблицу с собой, используя соответствующие критерии выбора. Это заставит MySQL рассматривать таблицу как две разных вещи, позволяя разрушительным изменениям идти вперед.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
, С другой стороны, вложение попытки подзапрос глубже в из пункта...
при абсолютной необходимости в подзапросе существует обходное решение, но это ужасно по нескольким причинам, включая производительность:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
вложенный подзапрос в ИЗ пункта создает неявная временная таблица , таким образом, это не рассчитывает как та же таблица, Вы обновляете.
..., но не упускают оптимизатор запросов
, Однако остерегаются этого от MySQL 5.7.6 и вперед, оптимизатор может оптимизировать подзапрос, и все еще дать Вам ошибку. К счастью optimizer_switch
переменная может использоваться для выключения этого поведения; хотя я не мог рекомендовать делать это как что-то большее чем кратковременное исправление этой ошибки, или для маленьких одноразовых задач.
SET optimizer_switch = 'derived_merge=off';
Благодаря Peter V. MГёrch для этого совета в комментариях.
метод В качестве примера был от Baron Schwartz, первоначально опубликован в Nabble, перефразируемом и расширенном здесь.
Вы могли вставить идентификаторы желаемых строк во временную таблицу и затем удалить все строки, которые найдены в той таблице.
, который может быть тем, какой @Cheekysoft подразумевал под выполнением его на двух шагах.
Если что-то не работает, когда проникающий через парадную дверь, то возьмите бэкдор:
drop table if exists apples;
create table if not exists apples(variety char(10) primary key, price int);
insert into apples values('fuji', 5), ('gala', 6);
drop table if exists apples_new;
create table if not exists apples_new like apples;
insert into apples_new select * from apples;
update apples_new
set price = (select price from apples where variety = 'gala')
where variety = 'fuji';
rename table apples to apples_orig;
rename table apples_new to apples;
drop table apples_orig;
Это быстро. Чем больше данные, тем лучше.
Внутреннее соединение
в вашем подзапросе не нужно. Похоже, вы хотите удалить записи в story_category
, где category_id
не находится в таблице category
.
Сделайте следующее:
DELETE FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category);
Вместо что:
DELETE FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category INNER JOIN
story_category ON category_id=category.id);