|
|
|
Генерация первичного ключа
|
|||
|---|---|---|---|
|
#18+
Есть таблица, одно из полей которой (первичный ключ) определено как AUTO_INCREMENT. Вот примерно так: CREATE TABLE Tbl1 ( ID BIGINT NOT NULL AUTO_INCREMENT, Name VARCHAR(255) NULL, PRIMARY KEY(ID) ) TYPE=InnoDB; Есть stored procedur'а для добавления записей в эту таблицу. Один из параметров процедуры - выходной, через которой я возвращаю значение ключа новой записи. Допустим, вот такая вот: create procedure AddToTbl1(out a_ID bigint, in a_Name varchar(255)) begin insert into Tbl1 values(null, a_Name); select max(ID) into a_ID from Tbl1; end; Так вот, вопрос. Переиспользуются ли значения для автоинкрементных полей? Т.е., если на данный момент макс. значение ID у меня 5321, и я грохну записи с ID со 100 по 200, то при следующем insert'е в таблицу ID новой записи у меня будет равен 100 или таки 5322 ? Есть ли вообще какие-то специфичные приемы генерации ключей в MySQL? Сорри за глупый вопрос (сам понимаю, что глупый), но нужно срочно . MySQL только 2 дня как поставил, до сих пор ни с чем кроме DB2/400 не работал... Если кто-нибудь вместо ответить ткнет носом в соответствующий раздел документации - тоже буду благодарен, абы оно работало и я не нервничал за свои процедуры... Спасибо! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 22:56:19 |
|
||
|
Генерация первичного ключа
|
|||
|---|---|---|---|
|
#18+
>Так вот, вопрос. Переиспользуются ли значения для автоинкрементных полей? Нет. Ответьте на вопрос. Вам нужен ключ для однозначной идентификации строки или поле, которое будет нумеровать строки? ---------------------------------------- Артисты не приехали, приехали цыгане ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2005, 11:29:26 |
|
||
|
Генерация первичного ключа
|
|||
|---|---|---|---|
|
#18+
4m@t!c>Так вот, вопрос. Переиспользуются ли значения для автоинкрементных полей? Нет. Ответьте на вопрос. Вам нужен ключ для однозначной идентификации строки или поле, которое будет нумеровать строки? Мне нужен таки _ключ для идентификации записи_, а не номер этой записи. Если значения полей не переиспользуются - то все ок, меня это как раз устраивает :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2005, 17:19:58 |
|
||
|
Генерация первичного ключа
|
|||
|---|---|---|---|
|
#18+
5322 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2005, 17:32:02 |
|
||
|
Генерация первичного ключа
|
|||
|---|---|---|---|
|
#18+
Во первых не совсем корректно извлекать последний ключ так create procedure AddToTbl1(out a_ID bigint, in a_Name varchar(255)) begin insert into Tbl1 values(null, a_Name); select max(ID) into a_ID from Tbl1; end; Лучше использовать функцию SELECT LAST_INSERT_ID() INTO ...; она возвращает для данного коннекта последний сгенерированный автоинкрементный ключ в любой таблице, в которой произошло последняя генерация ключа автоинкрементом. Значения полей в автоинкременте не переиспользуются, то что ты удалил ключ - это не значит, что он будет использован. Если же хочется сильно использовать дырки ключей в последовательности - пиши алгорит сам. Можно например хранить ключи дырок в таблице и отбирать их для новых записей и удалять, а при удалении из таблицы - добавлять туда ключи дырок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2005, 17:34:26 |
|
||
|
Генерация первичного ключа
|
|||
|---|---|---|---|
|
#18+
Переиспользование дырок мне как раз не интересно. Задача у меня - вернуть наверх из процедуры ID-шник вставленной записи, а то, что я его select max()'ом выбирал - так это извернулся от незнания :). Собственно, LAST_INSERT_ID() - это именно то, что мне нужно. Cпасибо!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2005, 21:28:24 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=643&tid=1853449]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
74ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 380ms |

| 0 / 0 |
