在公司表中,我们会将每个注册公司都添加到该应用中;在该表中,我有一个由“ user_id”和“ vat_number”(vat_number没有自动递增)组成的多个主键。 现在,我要做的是建立一个触发器,此触发器必须在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;
');
}
现在,当我尝试插入第一行whitin companies表(现在为空)时,出现此错误。
执行中:
插入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')
答案 0 :(得分:0)
在触发器中,没有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“是否已经有了新行的临时用户名id”