【问题标题】:Using Declare in MySQL在 MySQL 中使用声明
【发布时间】:2017-02-17 17:20:33
【问题描述】:

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

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我不知道是什么导致了问题。此外,如果这有助于在查询将其集合准备成这样的字符串时。

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;

【问题讨论】:

标签: php mysql blogs forum


【解决方案1】:

最近几天我生病了,所以我没有做太多的编码,但我花时间从我的电脑上学习更多 MySQL 并找到了解决这个问题的解决方案。使用的主要表是

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 表添加新行的存储过程

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

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

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 语句现在分为三个部分。

set AUTOCOMMIT = 0;
START TRANSACTION;
CALL addPost(?,?,?, @post_id);

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

CALL addPostTag(?, @post_id);

我为用户选择的每个标签运行这个 sql。我尝试将@post_id 存储为别名,但是当我在过程调用中使用它时,我一直收到错误消息。然后,如果没有返回错误,我将提交所有内容。

COMMIT;

我发布此答案是因为我在提出问题时没有找到针对此特定场景的任何解决方案。希望它对某人有所帮助,并再次感谢 Fred -ii- 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多