CREATE TABLE test1(a1 INT); 
CREATE TABLE test4(  
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,   
b4 INT DEFAULT 0); 
DELIMITER | 
CREATE TRIGGER testref BEFORE INSERT ON test1  FOR EACH ROW 
BEGIN      
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;  
END

DELIMITER ;
INSERT INTO test4 (a4) 
VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0),(0);
如果将下述值插入表test1,如下所示:
mysql> INSERT INTO test1 VALUES     
    -> (1), (3), (1), (7), (1), (8), (4), (4);
Query OK, 8 rows affected (0.01 sec)Records: 8  Duplicates: 0  Warnings: 0那么
mysql> SELECT * FROM test4;
+----+------+
| a4 | b4   |
+----+------+
|  1 |    3 |
|  2 |    0 |
|  3 |    1 |
|  4 |    2 |
|  5 |    0 |
|  6 |    0 |
|  7 |    1 |
|  8 |    1 |
|  9 |    0 |
| 10 |    0 |
+----+------+
10 rows in set (0.00 sec)我不是很明白触发器后面的插入语句有什么用,T4表已经声明a4是自增列,不明白这里插入0是什么意思?b4最后的结果为什么是3,0,1,2。。呢?

解决方案 »

  1.   

    T4表已经声明a4是自增列,不明白这里插入0是什么意思?
    就是插入10条记录,主键不能重复,插入1-10我不是很明白触发器后面的插入语句有什么用
    插入TEST1时对TEST4替换最后的结果为什么是3,0,1,2。。呢?
    1有3个
    4:2个
    7:1个
      

  2.   

    INSERT INTO test4 (a4) 
    VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0),(0);你说的没错,a4 是自增值,对于自增值来说,你可以在insert 语句中用 null, 或 0 来做输入,或者如你所说在前面不要把它加在表的列名中比如
    insert into test4(a5) values (0);
    但由于这个test4表就两个字段,你要么把字段全写,或者想省略,但无论是a4 或b4你总得保留一个吧。
      

  3.   

    触发器中当test1插入新记录时,会对test4做这个操作
    对UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;  
    这样你的test4中的值就被更新了。