информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыЗа кого нас держат?Страшный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Утекший код XP и Windows Server... 
 Дела виртуальные 
 Простое пробивание рабочего/провайдерского... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
mysql 23.12.04 11:23  
Автор: dron <Ivanov Andrey> Статус: Member
<"чистая" ссылка>
в сабже есть опция у числового столбца, зовется auto_increment, он гад постоянно увеличивается и даже если удалить из таблицы запись с максимальным значением такого столбаца и потом заинсертить новую, то следующее значение будет все равно на 1 больше,чем значение в удаленной записи. Очень хочется чтобы при удалении ззаписи с максимальным значением счетчик скручивался на 1, можно ли это осуществить какой-нить sql-ной или с-шной функцией???? Он же где-то должен хранится!!!
p.s. функцию last_insert_id смотрел - это не то, мне не надо знать последнее сгенеренное значение. мне надо уметь ставить счетчик в нужное значение... Спасибо
С точки зрения целостности это недопустимо. 24.12.04 12:50  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 24.12.04 12:50  Количество правок: 1
<"чистая" ссылка>
Извратный, но простой вариант: Копируем в новую табличку, старую удаляем, переименовываем. 24.12.04 11:01  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
Можно, как тебе предложили, самому бизнес логику... 24.12.04 10:49  
Автор: paganoid Статус: Member
<"чистая" ссылка>
> в сабже есть опция у числового столбца, зовется
> auto_increment, он гад постоянно увеличивается и даже если
> удалить из таблицы запись с максимальным значением такого
> столбаца и потом заинсертить новую, то следующее значение
> будет все равно на 1 больше,чем значение в удаленной
> записи. Очень хочется чтобы при удалении ззаписи с
> максимальным значением счетчик скручивался на 1, можно ли
> это осуществить какой-нить sql-ной или с-шной функцией????
> Он же где-то должен хранится!!!

Можно, как тебе предложили, самому бизнес логику реализовывать,
то бишь поле не автоинкрементное делать, и id самому вычислять
id = select max(*) или чото там.

Можно еще использовать в запросе на обновление специфические для mysql опции по работе
с уникальным полем - опять же см. мануал. Суть как раз в том,
что ежели идет дубляж по уникальным ключам, можно изменить
вводимое значение уникального ключа. Чото там "On duplicate"
вроде зовется.
А это поле случаем не виртуальное (вычисляемое). Зачем... 23.12.04 12:43  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
> в сабже есть опция у числового столбца, зовется
> auto_increment, он гад постоянно увеличивается и даже если
> удалить из таблицы запись с максимальным значением такого
> столбаца и потом заинсертить новую, то следующее значение
> будет все равно на 1 больше,чем значение в удаленной
> записи. Очень хочется чтобы при удалении ззаписи с
> максимальным значением счетчик скручивался на 1, можно ли
> это осуществить какой-нить sql-ной или с-шной функцией????
> Он же где-то должен хранится!!!
> p.s. функцию last_insert_id смотрел - это не то, мне не
> надо знать последнее сгенеренное значение. мне надо уметь
> ставить счетчик в нужное значение... Спасибо

А это поле случаем не виртуальное (вычисляемое). Зачем хранить в каждой записи значение, когда его можно легко вычислить по номеру записи. В этом случае разумеется никак. В противном (Вашем) случае произойдет нарушение логической структуры. А именно возможно наличие двух записей с одинаковым полем или пропущеное значение. По определению этого поля такого быть не должно.
что подразумевается под номером записи?? 23.12.04 14:40  
Автор: dron <Ivanov Andrey> Статус: Member
<"чистая" ссылка>
>это поле случаем не виртуальное (вычисляемое). Зачем
> хранить в каждой записи значение, когда его можно легко
> вычислить по номеру записи. В этом случае разумеется никак.
> В противном (Вашем) случае произойдет нарушение логической
> структуры. А именно возможно наличие двух записей с
> одинаковым полем или пропущеное значение. По определению
> этого поля такого быть не должно.
пример:
create table table (id int primary key auto_increment, car varchar(80));
заполняем ее значениями:
insert into table (car) values ('bmw')
insert into table (car) values ('mersedes')
insert into table (car) values ('audi')
делаем select * from table, получаем:

id car
1 bmw
2 mersedes
3 audi

удаляем 3-ю запись (delete from table where id=3)
вставляем новую запись (insert into table (car) values ('oka') )
делаем select * from table, получаем:

id car
1 bmw
2 mersedes
4 oka

т.есть новая запись пронумеровалась 4-й, а я хочу после удаления записи вручную отнимать от счетчика 1, чтоб новая запись нумеровалась опять-таки цифрой 3
Сам мути бизнес-логику триггерами или ещё как... Это стандартное поведение поля autoincrement, даже в Paradox ;-) 23.12.04 18:20  
Автор: HandleX <Александр Майборода> Статус: The Elderman
<"чистая" ссылка>
Редко встретишь базу которая по честному удаляет записи... 23.12.04 15:35  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 23.12.04 15:36  Количество правок: 1
<"чистая" ссылка>
> пример:
> create table table (id int primary key auto_increment, car
> varchar(80));
> заполняем ее значениями:
> insert into table (car) values ('bmw')
> insert into table (car) values ('mersedes')
> insert into table (car) values ('audi')
> удаляем 3-ю запись (delete from table where id=3)
> вставляем новую запись (insert into table (car) values
> ('oka') )
> делаем select * from table, получаем:
>
> id car
> 1 bmw
> 2 mersedes
> 4 oka
>
> т.есть новая запись пронумеровалась 4-й, а я хочу после
> удаления записи вручную отнимать от счетчика 1, чтоб новая
> запись нумеровалась опять-таки цифрой 3

Редко встретишь базу которая по честному удаляет записи. Если в старых DB-ориентированных/совместимых с этим было прозрачно - был атрибутик удаленности записи, то в современных все сильно маскируется. Хотя при желании запись все-таки можно восстановить. Короче запись там все-таки есть. В селектах ее соответственно не видно, но вычисляемое поле для нее просчитывается. В результате не увидеть ни записи, ни автоинкрементного поля. Отсутствие возможности его изменить, лишь только подтвердит нарушение целостности или вычисляемость этого поля.
autoincrement - такой тип переменный который всегда увеличивается. Не помню в mysql, но в MS можно создать тригеры на добавление/удаление записи и там вычисляь значение поля. Очень интересно увидеть "определение" для такой задачи. 23.12.04 15:24  
Автор: Garick <Yuriy> Статус: Elderman
<"чистая" ссылка>
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2020 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach