В таблице компаний у нас есть все зарегистрированные компании в приложение; в этой таблице у меня есть несколько первичных ключей, состоящих из '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')