2016-02-10 2 views
0

Каждый курс моей БД имеет корреспондентский факультет_ид.Синтаксис SQL Trigger

Каждый факультет имеет сходство с другими факультетами (и, как следствие, курсы с этими способностями). Факультет аффинности и курсов сродства представляют собой разделенные таблицы.

Я пытаюсь создать триггер, который удаляет записи из таблицы course_affinity, когда удаляется запись на faculty_affinity.

Это то, что у меня есть. Это не работает.

CREATE TRIGGER deleteCourses 
AFTER DELETE 
ON faculty_affinities 
AS 
BEGIN 
    DELETE FROM course_affinities 
    JOIN courses AS course1 
    JOIN courses AS course2 
    ON course_affinities.course1_id = course1.id 
    AND course_affinities.course2_id = course2.id 
    WHERE (course1.faculty_id = DELETED.faculty1_id OR course1.faculty_id = DELETED.faculty2_id) 
    AND (course2.faculty_id = DELETED.faculty1_id OR course2.faculty_id = DELETED.faculty2_id); 
END; 

Помогите кому-нибудь? Что я делаю не так?

Edit: я получаю ошибку

SQLSTATE[4200]: Syntax error... neas 'AS at line 4 

Edit2: мои Миграции

Schema::create('courses', function (Blueprint $table) { 
       $table->increments('id'); 
       $table->string('name', 150); 
       $table->integer('faculty_id')->unsigned(); 
       $table->foreign('faculty_id')->references('id')->on('faculties'); 
       $table->boolean('active')->default(1); 
       //$table->softDeletes(); 
      }); 

    Schema::create('faculties', function (Blueprint $table) { 
        $table->increments('id'); 
        $table->string('name', 150)->unique(); 
        $table->boolean('active')->default(1); 
        //$table->softDeletes(); 
      }); 


Schema::create('course_affinities', function (Blueprint $table) { 
       $table->increments('id'); 
       $table->integer('course1_id')->unsigned(); 
        $table->foreign('course1_id')->references('id')->on('courses'); 
       $table->integer('course2_id')->unsigned(); 
        $table->foreign('course2_id')->references('id')->on('courses'); 
       $table->boolean('active')->default(1); 
       //$table->softDeletes(); 
      }); 

Schema::create('faculty_affinities', function (Blueprint $table) { 
       $table->increments('id'); 
       $table->integer('faculty1_id')->unsigned(); 
        $table->foreign('faculty1_id')->references('id')->on('faculties'); 
       $table->integer('faculty2_id')->unsigned(); 
        $table->foreign('faculty2_id')->references('id')->on('faculties'); 
       $table->boolean('active')->default(1); 
       //$table->softDeletes(); 
      }); 
+0

не работает так, как? – artm

+0

Ошибка синтаксиса. Я отредактировал исходное сообщение с сообщением об ошибке. –

+0

Я не думаю, что вы можете удалить из 'JOIN', и я знаю, что' DELETED' не является допустимым ключевым словом в MySQL. Если вы опубликуете определения таблиц, мы можем направлять вас в правильном направлении. –

ответ

1

Вашего кода выглядит это, возможно, было написано для MS SQL Server, а не MySQL (использование из deleted виртуальных табличные подсказки); соответствующий синтаксис MySQL должен выглядеть следующим образом:

CREATE TRIGGER deleteCourses 
AFTER DELETE ON faculty_affinities 
FOR EACH ROW 
BEGIN 
    DELETE ca 
    FROM course_affinities ca 
    JOIN courses AS course1 ON ca.course1_id = course1.id 
    JOIN courses AS course2 ON ca.course2_id = course2.id  
    WHERE (course1.faculty_id = OLD.faculty1_id OR course1.faculty_id = OLD.faculty2_id) 
     AND (course2.faculty_id = OLD.faculty1_id OR course2.faculty_id = OLD.faculty2_id); 
END; 

Я не проверял, хотя так продолжаться с некоторой осторожностью ...

+0

Спасибо! Выглядит хорошо. Я все еще получаю сообщение об ошибке: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '' по строке 10 –

+0

@JulianM. Возможно, вам придется изменить разделитель инструкций на что-то другое, кроме полуколонны, или оно должно работать, если вы удалите запятую в конце строки 10 (после предложений where). См. Этот вопрос для примеров: http://stackoverflow.com/questions/8154158/mysql-how-do-i-use-delimiters-in-triggers – jpw

+0

Странно, что если я запустил этот запрос непосредственно в phpmyadmin или в Консоль MySQL, я не получаю ошибок. Я получаю сообщение об ошибке при запуске миграции на ремесленнике. Тем не менее, я редактировал свое сообщение с помощью текущего триггера. –