如何在MySQL中使用SELECT与INSERT子查询

时间:2014-07-29 13:30:18

标签: mysql

我想做这样的事情(伪代码):

SELECT IF (I don't get NULL, "pass", null)
FROM(
INSERT INTO table VALUES (value)
)

如果插入成功,它将不返回任何内容,因此该查询返回null。如果插入成功,我将获得“通过”而不是值。

我不知道该怎么做。我认为存储过程可以做到,但我也认为没有必要。

编辑: 到目前为止,我已尝试过这个:

INSERT INTO `permissions` VALUES (7,"test",null);

SELECT IF(`p_id` IS NOT NULL, "pass", null ) `p_id`
FROM `permissions`
WHERE `p_id` = 7; 

其中7是用户定义的。这个就像我想要的那样工作。它不是存储过程,但它是两个查询。我想知道只用一个查询是否可以做到这一点?

2 个答案:

答案 0 :(得分:1)

MySQL INSERT语句不返回结果集;所以它不能用于查询的行源。如果INSERT语句失败,则会抛出错误。

要返回结果集,需要执行单独的SELECT语句。

如果目标是执行单个数据库调用,则可以在存储过程的上下文中执行这两个语句。

修改

问:我想知道是否可以只使用一个查询来执行此操作?

答:不,只有一个声明是不可能的。您需要两个语句:INSERT语句(执行插入操作)和SELECT语句(返回结果)。

要在单个数据库调用中执行此操作,您需要一个执行以下两个语句的MySQL存储程序:首先,引发INSERT和catch错误(使用CONTINUE HANDLER),然后执行{{ 1}}返回结果集。

目前尚不清楚为什么需要返回包含SELECT'PASS'的列的结果集。

规范模式是运行NULL语句,检查是否抛出错误,和/或使用客户端库中可用的函数检查“受影响的行”,和/或运行单独的{ {1}}语句从MySQL INSERT函数中检索值,例如

SELECT

(要在存储过程中执行此操作,您需要在过程中定义ROW_COUNT()以“捕获”来自INSERT INTO mytable (mycol) VALUES ('myval') ; SELECT IF(ROW_COUNT(),'PASS',NULL) ; 的错误,以便该过程将继续运行(而不是抛出)错误)所以CONTINUE HANDLER语句将被运行。)

答案 1 :(得分:0)

这是你想要的吗?

INSERT INTO table1
(
 column1,
 column2,
)
VALUES
(
 (
   SELECT column
   FROM table2 
   JOIN table3 ON condition
 ),

 (
  "a string"
 ),
);

请参阅链接here