我想做这样的事情(伪代码):
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是用户定义的。这个就像我想要的那样工作。它不是存储过程,但它是两个查询。我想知道只用一个查询是否可以做到这一点?
答案 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