Как исправить ошибку триггера перед INSERT в MySQL? - PullRequest
0 голосов
/ 30 апреля 2019

В таблице компаний у нас есть все зарегистрированные компании в приложение; в этой таблице у меня есть несколько первичных ключей, состоящих из 'user_id' и 'vat_number' (vat_number no Auto-Increment). Теперь, что я хочу сделать, это создать триггер, этот триггер должен быть выполнен перед командой INSERT, и он должен быть в состоянии проверить, что невозможно, что существует user_id, связанный с тем же значением нового user_id (каждый пользователь должен быть точно связан только с одним номером vat_number. Это структура таблицы:

public function up()
{
    Schema::create('companies', function (Blueprint $table) {
        $table->engine = 'MyISAM';


        $table->integer('user_id')->unsigned();
        $table->string(‘vat_number’, 11);
        $table->string('name', 64);
        $table->char(‘phone’, 11);
        $table->string(‘street’, 64);
        $table->integer(‘house_number’);
        $table->string(‘city’, 64);
        $table->string(‘postal_code’, 64);
        $table->string('email', 64)->unique();
        $table->timestamps();

        //FOREIGN KEY
        $table->foreign('user_id')->references('id')->on('users');

        //PRIMARY KEY
        $table->primary(['user_id’,’vat_number’]);
    });

    DB::statement('ALTER TABLE companies MODIFY user_id INTEGER NOT NULL AUTO_INCREMENT');

}


//TRIGGER CODE

public function up()
{
DB::unprepared('
    CREATE TRIGGER beforeCompanyInsert
        BEFORE INSERT ON companies FOR EACH ROW
        BEGIN
            DECLARE msg VARCHAR(255);
            IF new.user_id = user_id THEN
                SIGNAL SQLSTATE “45000” SET MESSAGE_TEXT = “ERROR”;
            END IF;
         END;
');
}

Теперь, когда я пытался вставить в первую строку таблицу компаний (которая сейчас пуста), в результате я получил эту ошибку.

Выполнение: ВСТАВИТЬ В Luxury2. companies (user_id, vat_number, name, phone, street, house_number, city, postal_code, email) ('11 ',' 2132132 ',' 32 ',' 32 ',' 32 ',' 32 ',' 32 ',' 32 ', '32 @ 32.it');

ОШИБКА 1054: 1054: неизвестный столбец 'user_id' в 'списке полей' Оператор SQL: ВСТАВИТЬ В Luxury2. companies (user_id, vat_number, name, phone, street, house_number, city, postal_code, email) (11 ',' 2132132 ',' 32 ',' 32 ',' 32 ',' 32 ',' 32 ',' 32 ', '32 @ 32.it')

1 Ответ

0 голосов
/ 30 апреля 2019

В триггерах ссылки на поля без NEW или OLD (если только в контексте запроса внутри триггера) не имеют большого смысла.

Вместо: IF new.user_id = user_id THEN, что оставляет MySQL, спрашивая "user_id какой строки?"

Попробуйте: IF EXISTS (SELECT * FROM companies WHERE user_id = NEW.user_id) THEN, который сообщает MySQL "если уже есть строка с предварительным идентификатором user_id новой строки"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...