是否可以为CRUD查询设置一个SQL触发器,从查询本身获取一个额外的参数,而不将其用于查询



触发器对我来说是新的,我只是想知道如何才能充分利用它们。

这是两张表shelfs和shelfs_log:

CREATE TABLE `shelfs` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`shelf_name` VARCHAR(50) NULL DEFAULT NULL
`storage_id` INT(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`) USING BTREE
)
CREATE TABLE `shelfs_log` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`shelf_name` VARCHAR(50) NULL DEFAULT NULL
`storage_id` INT(11) NOT NULL,
`user_id` INT(11) NOT NULL,
PRIMARY KEY (`id`) USING BTREE
)

在为存储创建新机框时执行的PHP函数:$shelf_name、$storage_id(和$user_id(:

public static function createNewShelf($shelf_name, $storage_id)
{
global $conn;
$sql = "INSERT INTO shelfs (shelf_name, storage_id)
VALUES ('$shelf_name', '$storage_id')";
$result = $conn->query($sql);
$newShelf = array();
if ($result) {
$newShelf['success'] = true;
} else {
$newShelf['success'] = false;
}
return $newShelf;
$conn->close();
}

但我希望有一个触发器,它可以将这些插入的日志保存到一个separete表中,但也可以将user_id作为一个额外的参数,我可以在这些INSERT查询中传递该参数,而无需将用户_id写入shelfs表。

触发器类似于:

CREATE DEFINER=`root`@`localhost` TRIGGER `shelfs` 
AFTER INSERT ON `shelfs` 
FOR EACH ROW 
INSERT INTO shelfs_log (shelf_name, storage_id, user_id) 
VALUES (NEW.shelf_name, NEW.storage_id, NEW.user_id)

我有点难以解释,我在谷歌上找不到这件事的帮助。

提前感谢!

Akina为我的问题提供了完整的解决方案。使用SET@parameter_name:=$parameter_value;添加额外的参数;在原始INSERT查询中,并使用multi_query((运行:

$sql = "SET @user_id := $user_id; INSERT INTO shelfs (shelf_name, storage_id) VALUES ('$shelf_name', '$storage_id');";
$result = $conn->multi_query($sql);

在触发器之后,将获取名为@user_id:的额外参数

CREATE DEFINER=`root`@`localhost` TRIGGER `shelfs` 
AFTER INSERT ON `shelfs` 
FOR EACH ROW 
INSERT INTO shelfs_log (shelf_name, storage_id, user_id) 
VALUES (NEW.shelf_name, NEW.storage_id, @user_id)

如果可能的话,请告诉我如何在不将user_id写入第一个表的情况下传递user_id。–曼尼

未传递到查询中的额外数据可以通过用户定义的变量传递:

CREATE DEFINER=`root`@`localhost` TRIGGER `shelfs` 
AFTER INSERT ON `shelfs`
FOR EACH ROW 
INSERT INTO shelfs_log (shelf_name, storage_id, user_id) 
VALUES (NEW.shelf_name, NEW.storage_id, @user_id);

方法1。在INSERT查询之前赋值。

-- set the variable
SET @user_id := '444';
-- now insert
INSERT INTO shelfs (shelf_name, storage_id)
VALUES ('name 1', '11'),  ('name 2', '22');

两个查询必须在同一连接中执行。可以插入多个具有相同user_id的行。

方法2。使用INSERT .. SELECT在查询中分配值。

INSERT INTO shelfs (shelf_name, storage_id)
SELECT 'name 3', '33'
FROM ( SELECT @user_id := 555) set_variable
UNION ALL
SELECT 'name 4', '44';

在SELECT中使用UNION ALL可以插入多行。但它们都将使用从最后一个子查询中获取的相同user_id值(即,只有一个子查询应该包含from子句,其他所有子查询可能都没有(。

方法3。使用内联分配。

INSERT INTO shelfs (shelf_name, storage_id)
VALUES ('name 5', CASE WHEN (@user_id := 666) IS NOT NULL THEN '55' END), 
('name 6', CASE WHEN (@user_id := 777) IS NOT NULL THEN '66' END);

可以插入具有不同user_id值的多行。

演示小提琴

最新更新