информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыЗа кого нас держат?Spanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Извратный, но простой вариант: Копируем в новую табличку, старую удаляем, переименовываем. 24.12.04 11:01  Число просмотров: 2488
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
<programming>
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 <Денис Т.> Статус: 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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach