我想,在Start Transaction周围的复合sql语句中出现语法错误

时间:2016-07-21 03:46:06

标签: mysql database mysqli phpmyadmin

我正在努力使用这个复合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

它引发了以下错误:

1064 - 您的SQL语法出错;检查与MariaDB服务器版本对应的手册,以便在'INSERT

附近使用正确的语法

INTO   p_ucourse(     课程名,     course_goal,     course_time,'第2行

我无法获得该事物的语法。

1 个答案:

答案 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;部分。最后这个事实通常不会被弄清楚,直到用它浪费了很多时间。