在我的研究项目的框架中,我正在创建一个名为Permits的表,其中包含uuid列。现在,我想更改它以通过触发器将uuid设置为默认值。我在Workbench中工作时编写了代码,但是效果很好,但是,当我开始在laravel迁移中运行它时,我经常会遇到一个无法摆脱的语法错误:
PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER ;;
CREATE TRIGGER before_insert_permits
' at line 1")
用于创建表的代码:
public function up(): void
{
$queryString = /** @lang text */
'
CREATE TABLE `permits` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`code_uuid` BINARY(32) NOT NULL,
`user_id` INT(11) UNSIGNED NOT NULL,
`emission_date` DATETIME DEFAULT CURRENT_TIMESTAMP,
`expiry_date` DATE,
UNIQUE KEY unique_user_id_key (`user_id`),
CONSTRAINT `users_permits_fk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
';
DB::statement($queryString);
}
错误的迁移代码:
/**
* Run the migrations.
*
* @return void
*/
public function up(): void
{
$this->dropIdColumn();
$this->createUUIDcolumn();
$this->createUUIDtrigger();
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down(): void
{
}
/**
* Drops `id` column
*/
protected function dropIdColumn(): void
{
$queryString = /** @lang text */
'
ALTER TABLE `permits`
DROP COLUMN `id`;
';
DB::statement($queryString);
}
/**
* Makes `uuid_code` primary key
*/
protected function createUUIDcolumn(): void
{
$queryString = /** @lang text */
'
ALTER TABLE `permits`
ADD COLUMN `uuid` CHAR(36) NULL FIRST;
';
DB::statement($queryString);
}
/**
* Triggers auto fill for default
*/
protected function createUUIDtrigger(): void
{
$queryString = /** @lang text */
'
DELIMITER ;;
CREATE TRIGGER before_insert_permits
BEFORE INSERT ON `permits`
FOR EACH ROW
BEGIN
IF new.uuid IS NULL THEN
SET new.uuid = uuid();
END IF;
END;
;;
';
DB::statement($queryString);
}
在纯MySQL中运行的某些代码怎么可能落在Laravel中?我在这里想念什么?