【问题标题】:MySql: Insert a row and get the contentMySql:插入一行并获取内容
【发布时间】:2019-06-05 17:32:26
【问题描述】:

是否可以在同一查询中插入一行并获取插入的值?

类似...

INSERT INTO `items` (`item`, `number`, `state`) 
(SELECT '3', `number`, `state` FROM `item_bug` WHERE `id`='3')

然后,获取ID并执行一个

SELECT * FROM `items` WHERE `id`='$id'

但只使用一个查询。

【问题讨论】:

  • 不确定您的要求是否真的可以在一个 DML 查询中完成,但我正在关注这个问题,看看是否可以 - 知道会有所帮助。
  • 两个查询有什么问题?
  • 什么都没有,除了过载..
  • 两个查询不是原子的?

标签: mysql insert


【解决方案1】:

执行你的插入语句,然后你可以这样做:

SELECT * FROM `items` WHERE `id`= LAST_INSERT_ID()

【讨论】:

  • @Quassnoi:如果我不清楚,对不起。期望是 OP 执行原始问题中给出的 INSERT 语句。我会更好地充实答案。
  • 原始问题要求“插入一行并获取插入到同一查询中的值”。
  • @Quassnoi:我们都知道不能在这里完成。因此,我给 OP 一个替代解决方案。
【解决方案2】:

您可以调用一个存储过程,该过程将执行插入并在从您的应用层到 mysql 的一次调用中返回一个结果集:

存储过程调用

mysql> call insert_user('bar');
+---------+----------+
| user_id | username |
+---------+----------+
|       1 | bar      |
+---------+----------+
1 row in set (0.02 sec)

$sqlCmd = sprintf("call insert_user('%s')", ...);

简单示例:

drop table if exists users;
create table users
(
user_id int unsigned not null auto_increment primary key,
username varchar(32) unique not null
)
engine=innodb;


drop procedure if exists insert_user;

delimiter #

create procedure insert_user
(
in p_username varchar(32)
)
begin
declare v_user_id int unsigned default 0;

 insert into users (username) values (p_username);

 set v_user_id = last_insert_id();

 -- do more stuff with v_user_id e.g. logs etc...

 select * from users where user_id = v_user_id;

end#

delimiter ;

call insert_user('bar');

【讨论】:

  • 似乎比使用2个mysql查询要慢,不是吗?
  • 会不会跳上你的车开车去超市买面包然后开车回家,然后开车回去买牛奶比开车去超市买面包和牛奶快?一两次?
  • 太好了!感谢支持!
  • @Ivan 2 查询肯定更容易
【解决方案3】:

不,这在 MySQL 中是不可能的(与 Oracle 中的 PostgreSQLSQL ServerPL/SQL 不同)。

您必须在单独的查询中执行此操作。

【讨论】:

    【解决方案4】:

    如果您想选择该路线,您可以使用多个语句来执行此操作。首先,当您连接到数据库时,请确保将多个语句设置为 true:

    var connection = mysql.createConnection({
        host: databaseHost,
        user: databaseUser,
        password: databasePassword,
        database: databaseName,
        multipleStatements: true
    });
    

    然后你可以定义你的 sql 为:

    var sql = "your insert statement; your select statement";
    

    只需使用分号分隔各个语句。在此示例中,您的选择结果将是 results[1]。

    【讨论】:

      【解决方案5】:

      如果你使用的是 php 那么

      你可以用这个代替

      mysql_insert_id();
      

      这将给出最后插入记录的 id。

      其他数据将与插入相同。 只有 id 会改变,你可以通过mysql_insert_id()得到它

      所以你不需要运行第二个查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 2019-12-26
        • 2017-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多