在 MySQL 中使用声明
Using Declare in MySQL
我一直在建立一个论坛或博客,如果你愿意的话,我的网络作品集 PHP 和 MySQL。我对 PHP 相当不错,但是 MySQL 对我来说一直是个问题,因为在此之前我从来没有理由使用 MySQL 或任何数据库,而不是 MySQL错误消息是我见过的最糟糕的错误消息。这是我尝试用于向 forum/blog 添加新的 post 的查询。
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 的交汇点 table。问题是这样的。 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;
最近几天我生病了,所以我没有做太多编码,但我花时间从我的电脑上了解更多 MySQL 并找到了解决这个问题的解决方案。使用的主要 table 是
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 'stored procedures' 和一个完成的重做事务。
向 Post 添加新行的存储过程 table
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
标签 table 包含预定义值,我不想让用户添加新标签。用户可以 select 一个 post 多个标签,但因此需要联结 table。这是为连接 table.
添加行的存储过程
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 table 创建行。接下来是
CALL addPostTag(?, @post_id);
我 运行 这个 sql 用于用户 select 编辑的每个标签。我尝试将 @post_id
存储为别名,但在过程调用中使用它时,我一直收到错误消息。然后如果没有返回错误,我就用这个提交所有内容。
COMMIT;
我post编辑了这个答案,因为我在提出问题时没有找到针对这个特定场景的任何解决方案。希望它对某人有所帮助,再次感谢 Fred -ii- 的帮助。
我一直在建立一个论坛或博客,如果你愿意的话,我的网络作品集 PHP 和 MySQL。我对 PHP 相当不错,但是 MySQL 对我来说一直是个问题,因为在此之前我从来没有理由使用 MySQL 或任何数据库,而不是 MySQL错误消息是我见过的最糟糕的错误消息。这是我尝试用于向 forum/blog 添加新的 post 的查询。
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 的交汇点 table。问题是这样的。 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;
最近几天我生病了,所以我没有做太多编码,但我花时间从我的电脑上了解更多 MySQL 并找到了解决这个问题的解决方案。使用的主要 table 是
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 'stored procedures' 和一个完成的重做事务。
向 Post 添加新行的存储过程 table
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
标签 table 包含预定义值,我不想让用户添加新标签。用户可以 select 一个 post 多个标签,但因此需要联结 table。这是为连接 table.
添加行的存储过程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 table 创建行。接下来是
CALL addPostTag(?, @post_id);
我 运行 这个 sql 用于用户 select 编辑的每个标签。我尝试将 @post_id
存储为别名,但在过程调用中使用它时,我一直收到错误消息。然后如果没有返回错误,我就用这个提交所有内容。
COMMIT;
我post编辑了这个答案,因为我在提出问题时没有找到针对这个特定场景的任何解决方案。希望它对某人有所帮助,再次感谢 Fred -ii- 的帮助。