觸發器對我來說是新的,我只是想知道如何才能充分利用它們。
這是兩個表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();
}
但是我想要一個觸發器,將這些插入的日志記錄到一個單獨的表中,同時將 user_id 作為一個額外的引數,我可以傳遞這些 INSERT 查詢而不將 user_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)
我有點難以解釋,我在谷歌上找不到這件事的幫助。
提前致謝!
uj5u.com熱心網友回復:
請告訴我如何在可能的情況下傳遞 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可以插入具有不同值的多行。
DEMO fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/522273.html
標籤:mysqlsql触发器
上一篇:如何從2個不同的資料庫表中獲取資料并將mysql查詢連接在一起
下一篇:不能在sql中連接多個表
