首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中使用Declare

在MySQL中使用Declare
EN

Stack Overflow用户
提问于 2017-02-18 01:20:33
回答 1查看 279关注 0票数 1

我一直在建立一个论坛或博客,如果你愿意为我的网络投资组合与PHP和MySQL。我对PHP很在行,但MySQL一直是我的问题,因为在此之前,我从来没有理由使用MySQL或任何数据库,而不是MySQL错误消息是我见过的最糟糕的错误。这是我尝试用来向论坛/博客添加新帖子的查询。

代码语言:javascript
复制
START TRANSACTION;

DECLARE postKey int;

INSERT INTO posts(post_subject, post_content, post_date, post_by) 
SELECT ?, ?, NOW(), user_id FROM users WHERE user_name = ? LIMIT 1;

SET postKey = LAST_INSERT_ID();

INSERT INTO juct_tags_posts(post_key, tag_key) 
SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1;
INSERT INTO juct_tags_posts(post_key, tag_key) 
SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1;
INSERT INTO juct_tags_posts(post_key, tag_key) 
SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1;

COMMIT;

第一个插入是post_data。接下来的三个插入是到tag_id和post_id的连接表。问题是这样的。Prepare failed: (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 'DECLARE postKey int;INSERT INTO posts(post_subject, post_content, post_date, pos' at line 1我不知道是什么导致了这个问题。另外,如果这对查询有帮助,请将它的集合准备成如下所示的字符串。

代码语言:javascript
复制
START TRANSACTION;DECLARE postKey int;INSERT INTO posts(post_subject, post_content, post_date, post_by) SELECT ?, ?, NOW(), user_id FROM users WHERE user_name = ? LIMIT 1;SET postKey = LAST_INSERT_ID();INSERT INTO juct_tags_posts(post_key, tag_key) SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1;INSERT INTO juct_tags_posts(post_key, tag_key) SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1;INSERT INTO juct_tags_posts(post_key, tag_key) SELECT postKey, tag_id FROM tags WHERE tag_name = ? LIMIT 1;COMMIT;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-21 05:59:26

最近几天我一直在生病,所以我没有做太多的编码工作,但我花时间从我的电脑上学习了更多的MySQL,并偶然发现了一个解决这个问题的解决方案。使用的主要表格有

代码语言:javascript
复制
Posts (post_id int(11), post_subject varchar(255), post_content text, post_date datetime, fk_post_by int(11))
Tags (tag_id int(11), tag_name varchar(255))
Junction_Posts_Tags(junc_id int(11), fk_post_id int(11), fk_tag_id int(11))

我的新解决方案使用了2个“存储过程”和一个完整的重写事务。

用于向Post表添加新行的存储过程

代码语言:javascript
复制
addPost(IN msg text, IN sub varchar(255), IN poster varchar(255), OUT post int)
BEGIN
INSERT INTO posts(post_content, post_subject, post_date, post_by) 
SELECT msg, sub, NOW(), user_id 
FROM users 
WHERE user_name = poster;
SET post = LAST_INSERT_ID();
END

tags表包含预定义的值,我不想让用户添加新的标签。用户可以为一篇文章选择多个标签,因此需要连接表。这是用于为连接表添加行的存储过程。

代码语言:javascript
复制
addPostTag(IN tag varchar(255), IN post int)
BEGIN
INSERT INTO juct_tags_posts(post_key, tag_key) 
SELECT post_id, 
(SELECT tag_id 
FROM tags 
WHERE tag_name = tag) 
FROM posts 
WHERE post_id = post;
END

虽然这两个过程还没有完成,但我仍然希望在计算出DECLARE action HANDLER condition语句后添加错误处理。现在,我在PHP中使用的SQL语句分为三个部分。

代码语言:javascript
复制
set AUTOCOMMIT = 0;
START TRANSACTION;
CALL addPost(?,?,?, @post_id);

这将开始事务并在内存中为Post表创建行。下一步是

代码语言:javascript
复制
CALL addPostTag(?, @post_id);

我为用户选择的每个标记运行此sql。我尝试将@post_id存储为别名,但当我在过程调用中使用它时,总是出现as错误。然后,如果没有返回任何错误,我将使用这个提交所有内容。

代码语言:javascript
复制
COMMIT;

我之所以发布这个答案,是因为当我提出这个问题时,我没有找到这个特定场景的任何解决方案。希望它能帮助一些人,并再次感谢Fred -ii-的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42303856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档