LINUX.ORG.RU

[sqlite] Как узнать значение primary key для новой записи?


0

1

Привет.

Разбираюсь с SQL. Для связывания разных таблиц между собой решил использовать значение их primary key.

Вопрос в том, как узнать значение этого самого primary key для только что добавленной записи (INSERT). Или лучше его указывать вручную при INSERT? Но тогда как его определить? Если брать `SELECT max(id) FROM db_table` то при частом добавлении-удалении записей счетчик может переполнится. Можно взять первый индекс за которым есть пропуск, но каким запросом его найти?

Или может я вообще неправильно поступаю, используя primary key в качестве индекса в таблицах?

★★★★★

last_insert_rowid();

>Или может я вообще неправильно поступаю, используя primary key в качестве индекса в таблицах?

Правильно.

schizoid ★★★ ()

при частом добавлении-удалении записей счетчик может переполнится

64 бита должно хватить всем.

olegsov ()
Ответ на: комментарий от olegsov

64 бита должно хватить всем.

Пожалуй все таки да:

-> 2^64/(365*1e9)
 = 5.0539E+07

fat_angel ★★★★★ ()
Ответ на: комментарий от schizoid

А если в промежутке между INSERT и last_insert_rowid() какой-нибудь другой поток ещё чего-нибудь понавставлял? Или в sqlite есть что-то вроде транзакций?

yoghurt ★★★★★ ()
Ответ на: комментарий от yoghurt

да, в sqlite есть не чтото вроде, а полноценные транзакции

belka ()

Или может я вообще неправильно поступаю, используя primary key в качестве индекса в таблицах?

Первичный ключ понятие логическое и должно опираться на предметную область.
Если, скажем, это таблица bill и содержит номера счетов, то bill.id вполне может быть primary key (и браться из последовательности).
С другой стороны, если речь о таблице user, то лепить подобный первичный ключ сомнительное решение, - тк обычно идентифация юзера выполняется по user.login (или комбинации полей, в которую входит user.login).

ddt ()

Если счетчик переполнится, должно выбирать рандомом из освободившихся диапазонов. Так что не надо этого бояться :)

const86 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.