- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的previous question .我有解决方案来检查在插入数据之前重复了哪些数据。这是检查数据的MySQL存储过程:
DROP PROCEDURE IF EXISTS check_user_files;
DELIMITER \\
CREATE PROCEDURE check_user_files(IN p_user_id INT,IN p_file_id CHAR(10))
BEGIN
IF EXISTS(SELECT 1 FROM myTable WHERE user_id = p_user_id AND file_id= p_file_id) THEN
UPDATE myTable SET `file_status`=0 WHERE user_id=p_user_id AND file_id=p_file_id;
ELSE
INSERT INTO myTable(`user_id`,`file_status`,`file_id`)
VALUES (p_user_id,0,p_file_id);
END IF;
END \\
DELIMITER ;
调用存储过程:
CALL check_user_files('1','12');
表 [myTable]
结构:
auto_id user_id file_id file_status
1 1 12 1
2 3 12 0
3 1 17 1
4 4 31 1
5 1 41 0
6 4 31 0
7 1 18 1
8 5 11 0
9 1 10 0
我的问题是,我有多个数据要同时检查和插入。例如:
('1','12'),('2','14'),('3','16'),...
但是我不能同时调用存储过程来一次查询所有记录。例如:
CALL check_user_files('2','12');
CALL check_user_files('3','12');
...
只调用第一行存储过程。
那么,我怎样才能同时检查一个查询中的所有记录呢!>
非常感谢!!
最佳答案
可以使用单个调用存储过程来完成,但由于 mysql 不支持数组参数,它会有点难看,因为我们必须传入逗号分隔的 user_id;file_id 标记字符串。唯一的其他选择是多次调用存储过程。
完整脚本在这里:http://pastie.org/1722362
mysql> select * from user_files;
+---------+---------+-------------+
| user_id | file_id | file_status |
+---------+---------+-------------+
| 1 | 2 | 0 |
| 3 | 6 | 0 |
+---------+---------+-------------+
2 rows in set (0.00 sec)
call check_user_files('user_id;file_id, user_id;file_id...');
call check_user_files('1;2, 2;4, 3;6, 4;10, 50;50, 1000;1, 1;10001');
mysql> select * from user_files;
+---------+---------+-------------+
| user_id | file_id | file_status |
+---------+---------+-------------+
| 1 | 2 | 0 |
| 1 | 10001 | 0 |
| 2 | 4 | 0 |
| 3 | 6 | 0 |
| 4 | 10 | 0 |
| 50 | 50 | 0 |
| 1000 | 1 | 0 |
+---------+---------+-------------+
7 rows in set (0.00 sec)
存储过程
drop procedure if exists check_user_files;
delimiter #
create procedure check_user_files
(
in p_users_files_csv varchar(4096)
)
proc_main:begin
declare v_token varchar(255);
declare v_done tinyint unsigned default 0;
declare v_token_idx int unsigned default 1;
declare v_user_id int unsigned default 0;
declare v_file_id int unsigned default 0;
set p_users_files_csv = replace(p_users_files_csv, ' ','');
if p_users_files_csv is null or length(p_users_files_csv) <= 0 then
leave proc_main;
end if;
-- the real ugly bit
-- split the string into user_id/file_id tokens and put into an in-memory table...
create temporary table tmp(
user_id int unsigned not null,
file_id int unsigned not null
)engine = memory;
while not v_done do
set v_token = trim(substring(p_users_files_csv, v_token_idx,
if(locate(',', p_users_files_csv, v_token_idx) > 0,
locate(',', p_users_files_csv, v_token_idx) - v_token_idx, length(p_users_files_csv))));
if length(v_token) > 0 then
set v_token_idx = v_token_idx + length(v_token) + 1;
set v_user_id = mid(v_token, 1, instr(v_token, ';')-1);
set v_file_id = mid(v_token, instr(v_token, ';')+1, length(v_token));
insert into tmp (user_id, file_id) values(v_user_id, v_file_id);
else
set v_done = 1;
end if;
end while;
-- the nice bit - insert the new values
insert into user_files (user_id, file_id, file_status)
select
t.user_id, t.file_id, 0 as file_status
from
tmp t
left outer join user_files uf on t.user_id = uf.user_id and t.file_id = uf.file_id
where
uf.user_id is null and uf.file_id is null;
drop temporary table if exists tmp;
end proc_main #
delimiter ;
希望对你有帮助
关于mysql - 如何在 MySQL 或 PHP 中多次执行相同的存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5449897/
我正在运行一个辅助角色,并检查 Azure 上托管的存储中是否存在数据。当我将连接字符串用于经典类型的存储时,我的代码可以正常工作,但是当我连接到 V2 Azure 存储时,它会抛出此异常。 “远程服
在我的应用程序的主页上,我正在进行 AJAX 调用以获取应用程序各个部分所需的大量数据。该调用如下所示: var url = "/Taxonomy/GetTaxonomyList/" $.getJSO
大家好,我正在尝试将我的商店导入我的 Vuex Route-Gard。 路由器/auth-guard.js import {store} from '../store' export default
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我的 Windows 计算机上的本地文件夹中有一些图像。我想将所有图像上传到同一容器中的同一 blob。 我知道如何使用 Azure Storage SDKs 上传单个文件BlockBlobServi
我尝试发出 GET 请求来获取我的 Azure Blob 存储帐户的帐户详细信息,但每次都显示身份验证失败。谁能判断形成的 header 或签名字符串是否正确或是否存在其他问题? 代码如下: cons
这是用于编写 JSON 的 NeutralinoJS 存储 API。是否可以更新 JSON 文件(推送数据),而不仅仅是用新的 JS 对象覆盖数据。怎么做到的??? // Javascript
我有一个并行阶段设置,想知道是否可以在嵌套阶段之前运行脚本,所以像这样: stage('E2E-PR-CYPRESS') { when { allOf {
我想从命令行而不是从GUI列出VirtualBox VM的详细信息。我对存储细节特别感兴趣。 当我在GUI中单击VM时,可以看到包括存储部分在内的详细信息: 但是到目前为止,我还没有找到通过命令行执行
我有大约 3500 个防洪设施,我想将它们表示为一个网络来确定流动路径(本质上是一个有向图)。我目前正在使用 SqlServer 和 CTE 来递归检查所有节点及其上游组件,只要上游路径没有 fork
谁能告诉我 jquery data() 在哪里存储数据以及何时删除以及如何删除? 如果我用它来存储ajax调用结果,会有性能问题吗? 例如: $("body").data("test", { myDa
有人可以建议如何为 Firebase 存储中的文件设置备份。我能够备份数据库,但不确定如何为 firebase 存储中的文件(我有图像)设置定期备份。 最佳答案 如何进行 Firebase 存储的本地
我最近开始使用 firebase 存储和 firebase 功能。现在我一直在开发从功能到存储的文件上传。 我已经让它工作了(上传完成并且文件出现在存储部分),但是,图像永远保持这样(永远在右侧加载)
我想只允许用户将文件上传到他们自己的存储桶中,最大文件大小为 1MB,仍然允许他们删除文件。我添加了以下内容: match /myusers/{userId}/{allPaths=**} { al
使用生命周期管理策略将容器的内容从冷访问层移动到存档。我正在尝试以下策略,希望它能在一天后将该容器中的所有文件移动到存档层,但事实并非如此在职的。我设置了选择标准“一天未使用后”。 这是 json 代
对于连接到 Azure 存储端点,有 http 和 https 两个选项。 第一。 https 会带来开销,可能是 5%-10%,但我不支付同一个数据中心的费用。 第二。 http 更快,但 Auth
有人可以帮我理解这一点吗?我创建了Virtual Machine in Azure running Windows Server 2012 。我注意到 Azure 自动创建了一个存储帐户。当我进入该存
我是一名优秀的程序员,十分优秀!