2016-07-21 8 views
1

Ich kämpfe mit dieser Verbindung mysql. Ich verwende die Starttransaktion zum ersten Mal. Also wird alles sehr hilfreich sein.Syntaxfehler in einer Compound-SQL-Anweisung um Start-Transaktion, ich denke,

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 

Und es wirft den folgenden Fehler:

1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; Sie in der Bedienungsanleitung für die richtige Syntax zu Ihrem MariaDB Server-Version entspricht in der Nähe von '

INSERT

INTO p_ucourse ( COURSE_NAME, course_goal, course_time,' zu verwenden, in Zeile 2

ich in der Lage bin nicht zu holen Sie sich die Syntax der Sache

Antwort

1

fehlt Semikolon am Ende der ersten Zeile Ditto mit Commit Versuchen:..

START TRANSACTION; 
.. 
.. 
COMMIT; 

Für ein paar Beispiele siehe START TRANSACTION, COMMIT, and ROLLBACK Syntax.

... ...

wie für Ihr anderes Problem, betrachten die folgende:

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) 

So, der erste über (SET ucourse_id) erstickt, weil angenommen wurde, eine sein LOCAL Variable (wie es kein @ Zeichen hatte). Die ganze Sache lief nicht in einer gespeicherten proc/Funktion (ich nahm an). Lokale Variablen müssen mit einem DECLARE Leben eingeatmet werden.

aber ...

declare k int; -- error, can't do this outside of a store proc/func etc 

So sollte man bis auf Benutzervariablen vs lokale Variablen lesen, wann und wie man sie nutzen.

Lokale Variablen:DECLARE kann in gespeicherten Prozeduren, Funktionen, Ereignissen und Triggern verwendet werden. Aber sie müssen nur oben gruppiert auftreten, vor allen Befehlen und typischerweise direkt nach BEGIN. Andernfalls werden andere Fehler auftreten.

Benutzervariablen: (wie @myBirthday) No DECLARE wird mit ihnen verwendet. Sie verwenden Freiläufe mit weniger Einschränkungen, zum Beispiel wenn Sie nur außerhalb von Stored-Procs, -Funktionen, -Ereignissen und -Auslösern herumhacken (aber sie können sicherlich in ihnen verwendet werden). Beachten Sie, dass dies der einzige Typ von Variablen ist, die mit PREPARE, wie dem PREPARE stmt001 FROM @theSql; Teil davon, erfolgreich sein werden. Diese letzte Tatsache wird normalerweise nicht erkannt, bis man viel Zeit damit verschwendet.

+0

Danke das hat funktioniert. Wirklich schätzen. Wird die Antwort in 8 Minuten akzeptieren. Auch das führte zu einem weiteren Fehler bei SET # 1193 - Unbekannte Systemvariable 'ucourse_id'. Kannst du da helfen? – rookie

+1

Danke @Drew. Will mehr nachlesen. U hat in einer harten Terminsituation wirklich geholfen. Wirklich schätzen. – rookie