我正在努力使用这个复合mysql。我是第一次使用Start Transaction。所以任何事都会有所帮助。
START TRANSACTION
INSERT
INTO
p_ucourse(
course_name,
course_goal,
course_time,
course_creator_id,
course_status
)
VALUES(
'This Course',
'Goal of this course',
480,
1,
1
);
SET
ucourse_id = LAST_INSERT_ID();
INSERT
INTO
r_ucourse_module(course_id,
module_id,
rank)
VALUES(ucourse_id, 1, 1);
INSERT
INTO
r_ucourse_eu(
course_id,
lu_id,
rank,
afterclass
)
VALUES(ucourse_id, 1, 1, 0);
COMMIT
它引发了以下错误:
INTO p_ucourse( 课程名, course_goal, course_time,'第2行
我无法获得该事物的语法。
答案 0 :(得分:1)
在第一行末尾缺少分号。同上Commit
尝试:
START TRANSACTION;
..
..
COMMIT;
有关示例,请参阅START TRANSACTION, COMMIT, and ROLLBACK Syntax。
... ...
关于您的其他问题,请考虑以下内容:
create table MyThings
( id int auto_increment primary key,
thing varchar(100) not null
);
insert MyThings(thing) values ('Fred, the pet Anchovy');
SET ucourse_id = LAST_INSERT_ID(); -- Error 1193: unknown sys var ...
SET @ucourse_id = LAST_INSERT_ID(); -- YIPPIE, not a problem (user variable)
因此,上面的第一个(SET ucourse_id
)被阻塞,因为它被假定为LOCAL变量(因为它没有@
符号)。整个事情没有在存储过程/函数中运行(我假设)。局部变量需要使用DECLARE
来吸收生命。
但是...
declare k int; -- error, can't do this outside of a store proc/func etc
因此,应该阅读用户变量与局部变量,何时以及如何使用它们。
局部变量: DECLARE
可用于存储过程,函数,事件和触发器。但是它们需要在任何命令之前排在最上面,在BEGIN
之后。否则,将发生其他错误。
用户变量(例如@myBirthday)不使用DECLARE
。它们用于限制较少的自由轮,例如当您只是在存储过程,函数,事件和触发器之外进行攻击时(但当然可以在它们内部使用)。请注意,这些是PREPARE
成功的唯一变量类型,例如PREPARE stmt001 FROM @theSql;
部分。最后这个事实通常不会被弄清楚,直到用它浪费了很多时间。