2012-07-29 74 views
1

如何獲取更新後生成的哈希?更新觸發前的語法生成哈希

[email protected]:~$ 
[email protected]:~$ mysql -u root -p 
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 138 
Server version: 5.1.58-1ubuntu1 (Ubuntu) 

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. 
This software comes with ABSOLUTELY NO WARRANTY. This is free software, 
and you are welcome to modify and redistribute it under the GPL v2 license 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> use nntp; 
Reading table information for completion of table and column names 
You can turn off this feature to get a quicker startup with -A 

Database changed 
mysql> show tables; 
+---------------------+ 
| Tables_in_nntp  | 
+---------------------+ 
| articles   | 
| newsgroups   | 
| newsgroups_articles | 
+---------------------+ 
3 rows in set (0.00 sec) 

mysql> describe newsgroups; 
+-----------+----------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-----------+----------+------+-----+---------+----------------+ 
| id  | int(11) | NO | PRI | NULL | auto_increment | 
| newsgroup | longtext | NO |  | NULL |    | 
| hash  | char(32) | NO |  | NULL |    | 
+-----------+----------+------+-----+---------+----------------+ 
3 rows in set (0.00 sec) 

mysql> show triggers; 
+-----------+--------+------------+-----------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+ 
| Trigger | Event | Table  | Statement           | Timing | Created | sql_mode | Definer  | character_set_client | collation_connection | Database Collation | 
+-----------+--------+------------+-----------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+ 
| make_hash | INSERT | newsgroups | BEGIN 
    set new.hash = md5(new.newsgroup); 
    END | BEFORE | NULL |   | [email protected] | utf8     | utf8_general_ci  | latin1_swedish_ci | 
+-----------+--------+------------+-----------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+ 
1 row in set (0.00 sec) 

mysql> 
mysql> 
mysql> DELIMITER $$ 
mysql> 
mysql> USE `nntp`$$ 
Database changed 
mysql> CREATE 
    -> TRIGGER `nntp`.`make_hash_update` 
    -> AFTER UPDATE ON `nntp`.`newsgroups` 
    -> FOR EACH ROW 
    -> BEGIN 
    -> set old.hash = md5(new.newsgroup); 
    -> END$$ 
ERROR 1362 (HY000): Updating of OLD row is not allowed in trigger 
mysql> 
mysql> quit; 
    -> exit 
    -> ^CCtrl-C -- exit! 
Aborted 
[email protected]:~$ 

此外,從工作臺上,我看到了老觸發:

enter image description here

,但不知道怎樣添加額外的觸發器。

回答

1

這不是更新後,它是更新之前,新的。不太明白語法,但這至少不會產生語法錯誤。想要使用工作臺:

[email protected]:~$ 
[email protected]:~$ mysql -u root -p 
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 144 
Server version: 5.1.58-1ubuntu1 (Ubuntu) 

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. 
This software comes with ABSOLUTELY NO WARRANTY. This is free software, 
and you are welcome to modify and redistribute it under the GPL v2 license 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> use nntp; 
Reading table information for completion of table and column names 
You can turn off this feature to get a quicker startup with -A 

Database changed 
mysql> show triggers; 
+-----------+--------+------------+-----------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+ 
| Trigger | Event | Table  | Statement           | Timing | Created | sql_mode | Definer  | character_set_client | collation_connection | Database Collation | 
+-----------+--------+------------+-----------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+ 
| make_hash | INSERT | newsgroups | BEGIN 
    set new.hash = md5(new.newsgroup); 
    END | BEFORE | NULL |   | [email protected] | utf8     | utf8_general_ci  | latin1_swedish_ci | 
+-----------+--------+------------+-----------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+ 
1 row in set (0.00 sec) 

mysql> show create trigger make_hash; 
+-----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ 
| Trigger | sql_mode | SQL Original Statement                                    | character_set_client | collation_connection | Database Collation | 
+-----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ 
| make_hash |   | CREATE DEFINER=`root`@`localhost` TRIGGER `nntp`.`make_hash` 
BEFORE INSERT ON `nntp`.`newsgroups` 
FOR EACH ROW 
BEGIN 
    set new.hash = md5(new.newsgroup); 
    END | utf8     | utf8_general_ci  | latin1_swedish_ci | 
+-----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ 
1 row in set (0.00 sec) 

mysql> 
mysql> DELIMITER $$ 
mysql> 
mysql> USE `nntp`$$ 
Database changed 
mysql> CREATE 
    -> TRIGGER `nntp`.`make_hash_update` 
    -> BEFORE UPDATE ON `nntp`.`newsgroups` 
    -> FOR EACH ROW 
    -> BEGIN 
    -> set new.hash = md5(new.newsgroup); 
    -> END$$ 
Query OK, 0 rows affected (0.19 sec) 

mysql> 
mysql> show triggers; 
    -> ^CCtrl-C -- exit! 
Aborted 
[email protected]:~$