из вашего описания я предполагаю, что ваша база данных не поддерживает поля идентификаторов автоинкремента (MS SQL поддерживает, у Oracle есть «последовательности», которые такие же хорошие, если не лучше, я не помню, чтобы MySql имел). 1001 *
Если это так, то все, что вам нужно, это автоинкрементный FooId и автоинкрементный BarId, а у Bar также есть FooId в качестве внешнего ключа
Если это не так, вы можете создать однорядную таблицу для распределения следующим образом:
create table SystemCounter
(
SystemCounterId int identity not null,
BarIdAllocator int
)
--initialize SystemCounter to have one record with SystemCounterId = 1
--and BarIdAllocator = 0
insert into SystemCounter values (1,0)
--id allocator procedure
create procedure GetNextBarId ( @BarId int output ) AS
SET NOCOUNT ON
begin tran
update SystemCounter set
@BarId = BarIdAllocator = BarIdAllocator + 1
where SystemCounterId = 1
commit
GO
обратите внимание, что если ваша база данных не поддерживает синтаксис
@BarId = BarIdAllocator = BarIdAllocator + 1
тогда вам нужно будет сделать это таким образом
begin tran
update SystemCounter set
BarIdAllocator = BarIdAllocator + 1
where SystemCounterId = 1
select
@BarId = BarIdAllocator
from SystemCounter
where SystemCounterId = 1
commit
РЕДАКТИРОВАТЬ: Я изначально пропустил тег Oracle, так что решение Билла это все, что необходимо. Оставляю этот ответ в качестве примера того, как это сделать, если кто-то использует базу данных, которая не поддерживает идентифицирующие или последовательные конструкции