← Back to team overview

maria-discuss team mailing list archive

Fwd: mysql_insert_id() for INSERT...SELECT statement

 

Hi,

I made a post at https://stackoverflow.com/questions/48306962/mysql-
insert-id-for-insert-select-statement, but have not received any helpful
answer, may be you could help me.
I am using MaridDB but I read MySQL documentation because it has much more
elaborated documentation than the same page for MariaDB.

I am doing similar INSERT...SELECT query to this

    INSERT INTO table (value1, value2)
    SELECT 'stuff for value1', 'stuff for value2' FROM DUAL
    WHERE NOT EXISTS (SELECT * FROM table
          WHERE value1='stuff for value1' AND value2='stuff for value2')
    LIMIT 1

, where table has auto-genrated id.

And I would like to know if it was inserted or not, of course. I assume the
way to do that is to use `mysql_insert_id()`. It returns 0 if no insertions
happen and 1 if insertions happen. Looking more details [here](
https://dev.mysql.com/doc/refman/5.7/en/mysql-insert-id.html).

> If an INSERT ... SELECT statement is executed, and **NO** automatically
> generated value is successfully inserted, mysql_insert_id() **RETURNS**
> the ID of the last inserted row.

What does it return if no auto-generated ID was successfully inserted? Is
this a doc typo?

So far I did testing in C and `mysql_insert_id()` returns always 0 if
insertion did not happen even if the last insertion succeeded and
`mysql_insert_id()` returned non-zero result. A paragraphs in the same
manual, mentioned above, confirms this behavior by saying:


>  mysql_insert_id() returns 0 if the previous statement does not use an
AUTO_INCREMENT value. ....
>
> The value of mysql_insert_id() is affected only by statements issued
within the current client connection. It is not affected by statements
issued by other clients.
>
> The LAST_INSERT_ID() SQL function will contain the value of the first
automatically generated value that was successfully inserted.
LAST_INSERT_ID() is not reset between statements because the value of that
function is maintained in the server. ....

And that feels kind of logical otherwise `INSERT...SELECT` would be useless
in many cases, if you cannot know within the code if your insertion worked
or not. But it totally contradicts to the statement above. Did anyone have
experience with this?

>From MariaDB manual, also suggests that the value should be zero in case of
insertion did not happen:

> The mysql_insert_id() function returns the ID generated by a query on
> a table with a column having the AUTO_INCREMENT attribute or the value
> for the last usage of LAST_INSERT_ID(expr). If the last query wasn't
> an INSERT or UPDATE statement or if the modified table does not have a
> column with the AUTO_INCREMENT attribute and LAST_INSERT_ID was not
> used, this function will return zero.

Does `mysql_insert_id()` of MariaDB returns 0 for `INSERT...SELECT` if an
insertion did not happen, or it might return some other non-zero value?  Do
you think it is a typo at MySQL documentation?

Best,
Yuki

Follow ups