A表先 生成一条记录 ,提交
提交后得到A表此记录的字段S的值 
用字段S的值做关键字生成B表记录 
如果不生成,所有都回滚这个用什么办法做?我现在可以想到的办法是触发器,A表insert后触发生成B表的事务
如果有错误就都回滚用事物试了一下,没能试成功
加上事务START TRANSACTION:提示错误如下:
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':
                INSERT INTO doc_head 
                    (serial,client_nam' at line 13请问怎么可以实现我的需求?请问我这个错误是个什么意思?
有没有什么好的办法

解决方案 »

  1.   

    http://topic.csdn.net/u/20091112/15/d10ca107-55e7-4935-bcef-e45d92c39e2c.html?20832
    #12楼  的例子
      

  2.   

    在MYSQL的TRIGGER中是不能用事务的,直接在SP中,字段S是什么类型?自增?
      

  3.   

    MYSQL 触发器 中不允许有事务的语句。所以你不能使用 START TRANSACTION / rollback / commit 等语句。但你可以人为的形成一个错误,然后所有语句都会回滚。
      

  4.   

    http://topic.csdn.net/u/20091112/22/7a3fb8eb-ff64-47c2-bf87-6f5bd8165e82.html在你的另一个贴子 #1楼 中已经回复你了啊。 
      

  5.   

    mysql> create table a (id int,s int);
    Query OK, 0 rows affected (0.09 sec)mysql> create table b (s int primary key);
    Query OK, 0 rows affected (0.06 sec)mysql>
    mysql> delimiter |
    mysql>
    mysql> CREATE TRIGGER tr_a_bi BEFORE INSERT ON a
        ->   FOR EACH ROW BEGIN
        ->     INSERT INTO b SET s = NEW.s;
        ->   END;
        -> |
    Query OK, 0 rows affected (0.08 sec)mysql>
    mysql> delimiter ;
    mysql>
    mysql> insert into a values (1,1);
    Query OK, 1 row affected (0.05 sec)mysql> select * from a;
    +------+------+
    | id   | s    |
    +------+------+
    |    1 |    1 |
    +------+------+
    1 row in set (0.00 sec)mysql> select * from b;
    +---+
    | s |
    +---+
    | 1 |
    +---+
    1 row in set (0.00 sec)mysql>
    mysql> insert into a values (2,1);
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    mysql> select * from a;  -- 记录未插入。如果不生成,所有回滚
    +------+------+
    | id   | s    |
    +------+------+
    |    1 |    1 |
    +------+------+
    1 row in set (0.00 sec)mysql> select * from b;
    +---+
    | s |
    +---+
    | 1 |
    +---+
    1 row in set (0.00 sec)mysql>
      

  6.   


    想的是就用INCREMENT()得到一个唯一整数,做为关键字
      

  7.   


    我没有用触发器啊,我的代码如下:DROP FUNCTION IF EXISTS `proc_doc_insert`;CREATE DEFINER = `root`@`localhost` FUNCTION `proc_doc_insert`( serial INT(7),
                                                                                            client_name CHAR(20),
                                                                                            asset_code CHAR(10),
                                                                                            machine_type CHAR(50),
                                                                                            machine_seria CHAR(40),
                                                                                            sort TINYINT(1),
                                                                                            sort_other CHAR(20),
                                                                                            open_time INT(10),
                                                                                            come_time INT(10))
     RETURNS tinyint(1)
    BEGIN START TRANSACTION:
                    INSERT INTO doc_head 
                        (serial,client_name,asset_code,machine_type,machine_serial,sort,sort_other,open_time,come_time) 
                        VALUES( serial,client_name,asset_code,machine_type,machine_seria,sort,sort_other,open_time,come_time);
    COMMIT:
            RETURN 1;
    END;
      

  8.   


    谢谢,但是还是有些不解的地方:
    1。你用的是触发器吧?
    2。可以同时回滚A表增加的记录吗?
    3。我还有个C表,那个C表也是用A.S来生成记录,不过是1对多,C表detail会可能发生多条记录,这个怎么办?
      

  9.   

    如果是自增,可以直接用
    LAST_INSERT_ID()得到刚插入的值,在SP中START TRANSACTION:->START TRANSACTION;
      

  10.   

    mysql没有触发器回滚?那是不是说如果用触发器就回滚不了?
      

  11.   

    只能在SP中,TRIGGER、UDF中不能使用事务
      

  12.   

    DROP FUNCTION IF EXISTS `proc_doc_insert`;delimiter //CREATE DEFINER = `root`@`localhost` FUNCTION `proc_doc_insert`( serial INT(7),
                                                client_name CHAR(20),
                                                asset_code CHAR(10),
                                                machine_type CHAR(50),
                                                machine_seria CHAR(40),
                                                sort TINYINT(1),
                                                sort_other CHAR(20),
                                                open_time INT(10),
                                                come_time INT(10))
     RETURNS tinyint(1)
    BEGIN START TRANSACTION;
            INSERT INTO doc_head 
              (serial,client_name,asset_code,machine_type,machine_serial,sort,sort_other,open_time,come_time) 
              VALUES( serial,client_name,asset_code,machine_type,machine_seria,sort,sort_other,open_time,come_time);
    COMMIT;
        RETURN 1;
    END;
    //delimiter ;你的是语法错误! MYSQL中语句是用; 结束而不是:START TRANSACTION:
    COMMIT:
      

  13.   

    谢谢,但是还是有些不解的地方:
    1。你用的是触发器吧?
    2。可以同时回滚A表增加的记录吗?
    试验中的例子已经清晰显示了! 
     -- 记录未插入。如果不生成,所有回滚3。我还有个C表,那个C表也是用A.S来生成记录,不过是1对多,C表detail会可能发生多条记录,这个怎么办?
    举例说明。
    问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧)学会提问,就象这个贴子中的问题,你不贴出你的
    START TRANSACTION:
    另外怎么去猜你的语法错误呢?
      

  14.   


    下面例子中已经清楚的显示了,记录全部回滚了。表A,表B中这条 insert into a values (2,1);记录都没有插入。
    建议楼主能仔细阅读回复。mysql> insert into a values (2,1);
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    mysql> select * from a;  -- 记录未插入。如果不生成,所有回滚
    +------+------+
    | id   | s    |
    +------+------+
    |    1 |    1 |
    +------+------+
    1 row in set (0.00 sec)mysql> select * from b;
    +---+
    | s |
    +---+
    | 1 |
    +---+
    1 row in set (0.00 sec)mysql>