[fpc-pascal] Re: How to insert a record and get the primary key with sqldb?

michael.vancanneyt at wisa.be michael.vancanneyt at wisa.be
Mon Oct 24 11:14:06 CEST 2011



On Mon, 24 Oct 2011, Reinier Olislagers wrote:

> On 22-10-2011 15:33, michael.vancanneyt-0Is9KJ9Sb0A at public.gmane.org wrote:
>>
>>
>> On Sat, 22 Oct 2011, Marco van de Voort wrote:
>>
>>> In our previous episode, Felipe Monteiro de Carvalho said:
>>>> Ok, now I want to insert a record in my table and I would like to
>>>> obtain the auto-generated PrimaryKey
>>>
>>> This is a classic problem, since SQL simply doesn't support this.
>>>
>>> So all DBs do something else, for postgresql there are sequence
>>> objects that
>>> can be queried, while other allow to return the id of the autogenerated
>>> fields.
>>>
>>> Afaik sqldb does not abstract this yet.
>>
>> That's because it can't be abstracted correctly. There are 2
>> incompatible mechanisms.
>>
>> 1. autogenerated fields (mysql, MS SQL server) which must be retrieved
>> after the insert using a special API.
>>
>> 2. or sequences, which must be generated manually before the insert
>> (DB2, Oracle, Firebird) using a special
>>    API, but which may or may not be generated in an AFTER INSERT trigger.
>>    In which case it's impossible to retrieve the sequence value after
>> the insert except by re-reading the record.
>
> Correct, but for option 2. - at least in Firebird - BEFORE INSERT
> triggers are often used, not AFTER INSERT.
> See eg http://www.firebirdfaq.org/faq29/

Typo on my part, sorry.

>
> Also, using INSERT...RETURNING it's very well possible to get the
> sequence value directly when inserting the data.

Yes, but not all DBs support this. We use Firebird a lot, and it didn't
support that construct until version 2.1 or so.

In each case: it's hard to abstract correctly, but nevertheless we'll try
and make managing this easier. Martin's ideas for this are useful.

What's funny is that I never understood how the MySQL/SQL-Server way could
correctly work. For example I have 2 tables, both with an auto-incremental
field. 
Table 1 has an after insert trigger that does an extra insert in table 2. 
When I do an insert in table 1 , what does 'last_insert_id' return ? 
The value for table 2 or table 1 ? 
The last inserted id for your connection is the one for table 2, but you 
need/expect the last id for table 1 :-)

Michael.



More information about the fpc-pascal mailing list