Mysql
 sql >> Baza danych >  >> RDS >> Mysql

uzależnione od zduplikowanej aktualizacji klucza

Możesz użyć normalnych konstrukcji sql w ON DUPLICATE KEY składnia. Aby wykonać warunkowe aktualizacje podczas wstawiania, możesz wykonać następujące czynności:

INSERT INTO tbl (hat, mittens, name) 
VALUES ('yellow','purple','jimmy')
ON DUPLICATE KEY UPDATE name = CASE WHEN name <> VALUES(name) 
                                    THEN VALUES(name) ELSE name END;

Spowoduje to zmianę wartości na tę, którą podałeś w instrukcji INSERT, gdy różni się ona od wartości w wierszu i ustawi wartośćtak, jaka jużjest, jeśli nie uległa zmianie, co spowoduje, że MySQL nie zrobi nic z zachowaniem wiersza znacznik czasu last_update, jak zauważył Quassnoi.

Jeśli chcesz mieć 100% pewności, że nie polegasz na zachowaniu MySQL, w którym nie aktualizuje on wiersza, jeśli ustawisz dla siebie wartość, możesz wykonać następujące czynności, aby wymusić znacznik czasu:

INSERT INTO tbl (hat, mittens, name) 
VALUES ('yellow','purple','jimmy')
ON DUPLICATE KEY UPDATE name = CASE WHEN name <> VALUES(name) 
                                    THEN VALUES(name) ELSE name END
                      , last_update = CASE WHEN name <> VALUES(name) 
                                      THEN now() ELSE last_update END;

To zaktualizuje tylko last_update do now() gdy nazwa się zmieni, w przeciwnym razie poinformuje MySQL, aby zachował wartość last_update .

Ponadto w sekcji ON DUPLICATE KEY instrukcji można odwoływać się do kolumn w tabeli według ich nazw, a wartości podane w sekcji instrukcji insert values ​​można uzyskać za pomocą atrybutu WARTOŚCI(nazwa_kolumny) funkcja.

Poniżej znajduje się dziennik, który pokazuje, że ostatnia podana instrukcja działa nawet w wersji 4.1, gdzie inne nie działają z powodu błędu, który został naprawiony w wersji 5.0.

C:\mysql\bin>mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.1.22-community

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+----------+
| Database |
+----------+
| mysql    |
| test     |
+----------+
2 rows in set (0.00 sec)

mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> CREATE TABLE `tbl` (
    -> `hat` varchar(11) default NULL,
    -> `mittens` varchar(11) default NULL,
    -> `name` varchar(11) default NULL,
    -> `stamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
    -> UNIQUE KEY `clothes` (`hat`,`mittens`)
    -> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george');
Query OK, 1 row affected (0.00 sec)

mysql> select * from tbl;
+------+---------+--------+---------------------+
| hat  | mittens | name   | stamp               |
+------+---------+--------+---------------------+
| blue | green   | george | 2009-06-27 12:15:16 |
+------+---------+--------+---------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name='george';
Query OK, 2 rows affected (0.00 sec)

mysql> select * from tbl;
+------+---------+--------+---------------------+
| hat  | mittens | name   | stamp               |
+------+---------+--------+---------------------+
| blue | green   | george | 2009-06-27 12:15:30 |
+------+---------+--------+---------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO tbl (hat, mittens, name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name=CASE WHEN name <> VALUES(name) THEN VALUES(name) ELSE name END;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from tbl;
+------+---------+--------+---------------------+
| hat  | mittens | name   | stamp               |
+------+---------+--------+---------------------+
| blue | green   | george | 2009-06-27 12:15:42 |
+------+---------+--------+---------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name = CASE WHEN name <> VALUES(name) THEN VALUES(name) ELSE name END, stamp = CASE WHEN name <> VALUES(name) THEN now() ELSE stamp END;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from tbl;
+------+---------+--------+---------------------+
| hat  | mittens | name   | stamp               |
+------+---------+--------+---------------------+
| blue | green   | george | 2009-06-27 12:15:42 |
+------+---------+--------+---------------------+
1 row in set (0.00 sec)

mysql>

Daj mi znać, jeśli masz jakieś pytania.

HTH,

-Dipin



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql tworzy procedurę składowaną z wielu procedur składowanych

  2. ORDER BY NULL w MySQL

  3. mysql konwertuje wiele wierszy na kolumny w jednym wierszu

  4. php mySQL group concat i group by

  5. Symfony:Wystąpił wyjątek w sterowniku:nie można znaleźć sterownika za pomocą mysql