触发器对我来说是新的,我只是想知道如何才能充分利用它们。
这是两张表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
值的多行。
演示小提琴