sql >> Databasteknik >  >> RDS >> Mysql

Byter kolumnvärden i MySQL

Jag var bara tvungen att ta itu med detsamma och jag ska sammanfatta mina resultat.

  1. UPDATE table SET X=Y, Y=X tillvägagångssättet fungerar uppenbarligen inte, eftersom det bara ställer båda värdena till Y.

  2. Här är en metod som använder en temporär variabel. Tack till Antony från kommentarerna från http://beerpla .net/2009/02/17/swapping-column-values-in-mysql/ för "IS NOT NULL"-justeringen. Utan det fungerar frågan oförutsägbart. Se tabellschemat i slutet av inlägget. Den här metoden byter inte ut värdena om ett av dem är NULL. Använd metod #3 som inte har denna begränsning.

    UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;

  3. Denna metod erbjöds av Dipin i, återigen, kommentarerna från http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . Jag tycker att det är den mest eleganta och rena lösningen. Det fungerar med både NULL- och icke-NULL-värden.

    UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;

  4. Ett annat tillvägagångssätt jag kom på som verkar fungera:

    UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;

I huvudsak är den första tabellen den som uppdateras och den andra används för att hämta gamla data från.
Observera att detta tillvägagångssätt kräver en primärnyckel för att vara närvarande.

Detta är mitt testschema:

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);


  1. Hur current_timestamp() fungerar i PostgreSQL

  2. SQL CASE-sats

  3. SQL-tabell med listpost vs SQL-tabell med en rad för varje post

  4. Hur kan jag manipulera MySQL fulltext sökrelevans för att göra ett fält mer "värdefullt" än ett annat?