Преобразование параметров потока между C ++ и C ++ / CLI

Мне просто приходилось иметь дело с тем же, и я обобщу свои выводы.

  1. Подход UPDATE table SET X=Y, Y=X, очевидно, не работает, поскольку он просто установит оба значения в Y .
  2. Вот метод, который использует временную переменную. Спасибо Антонию из комментариев http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ для настройки «IS NOT NULL». Без него запрос работает непредсказуемо. См. Схему таблицы в конце сообщения. Этот метод не меняет значения, если один из них равен NULL. Используйте метод №3, который не имеет этого ограничения. UPDATE swap_test SET x=y, y=@temp WHERE (@temp:=x) IS NOT NULL;
  3. Этот метод был предложен Dipin in, но опять же комментарии http://beerpla.net/2009/02/17/swapping-column-values-in-mysql / . Я думаю, что это самое элегантное и чистое решение. Он работает как с значениями NULL, так и с не-NULL. UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
  4. Другой подход, с которым я столкнулся, кажется, работает: UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;

По существу, первая таблица обновляется, а вторая - используется для извлечения старых данных. Обратите внимание, что для этого подхода необходим первичный ключ.

Это моя тестовая схема:

CREATE TABLE `swap_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `x` varchar(255) DEFAULT NULL,
  `y` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `swap_test` VALUES ('1', 'a', '10');
INSERT INTO `swap_test` VALUES ('2', NULL, '20');
INSERT INTO `swap_test` VALUES ('3', 'c', NULL);

0
задан luisp 18 January 2019 в 17:31
поделиться