Здравствуйте! Есть таблица tbl след. структуры (два поля):id (int) auto_increment,
value(int)В табл. tbl должно быть фиксированное кол-во строк(F_NUM), при том, что добавляются новые строки и старые необходимо удалять. Т.е. должно получиться типа что-то кольца.
При добавления новой и удаления старой строки в итоге получится примерно след, F_NUM=4:
id value
4294967292 10
4294967293 11
4294967294 12
4294967295 13Если попытаться добавить новую строку, то не получается т.к. id=int.(id не станет равным 0)
Реализация ниже (MYSQL C API). Видимо это не правильно. Подскажите пожалуйста, как это реализовать?...
mysql_query(conn,"SELECT * FROM tbl ORDER BY id ASC");
res=mysql_store_result(conn);
NUM=mysql_num_rows(res); //Кол-во записей в tblchar buff[250];
if(NUM>F_NUM) //кол-во записей в tbl больше чем положено F_NUM тогда
{
int deff=NUM-F_NUM; //Кол-во записей которые надо удалить
sprintf(buff,"DELETE FROM tbl ORDER BY id ASC LIMIT %d",deff);
mysql_query(conn,buff);
}
...
Вы так путано все объяснили... Но может быть проще незабивать себе голову, а повесить на эту таблицу триггер на insert, который и будет удалять необходимые записи при добавлении новой?
>Вы так путано все объяснили... Но может быть проще незабивать себе голову,
>а повесить на эту таблицу триггер на insert, который и будет
>удалять необходимые записи при добавлении новой?Да, извините, хотел как можно компактнее. С триггерами не работал, можно пример или ссылку. Спасибо!
На самом деле не так все и сложно. Может так проще будет:id val
1 10 <- Удаляем запись DELETE(), т.к. записей в таблице недолжно быть > 4(например)
2 11
3 12
4 13
5 14 <- добавили новую запись INSERT()Получаем:
id val
2 11
3 12
4 13
5 14Затем втавляем след. запись, получаем:
id val
3 12
4 13
5 14
6 15Может здесь id и не нужен, но мне как-то надо было определить какая запись более старая (наименьший id)
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.htmlНу и приблизительно так:
delimiter |
create trigger on имяттриггера before insert on имятаблицы
for each row
begin
delete from имятаблицы where id=(select min(id) from имятаблицы);
end;
|После создания такого триггера, MySQL _сам_ будет удалять запись с наименьшим ID при добавлении записи в таблицу.
>http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
>
>Ну и приблизительно так:
>
>delimiter |
>create trigger on имяттриггера before insert on имятаблицы
> for each row
> begin
> delete from имятаблицы where id=(select min(id) from имятаблицы);
> end;ему нужно, чтобы не сразу удалял, а только когда записей больше n, а такой тригер будет срабатывать каждый раз придобавлении записи
Это тоже не проблема. Только я можно я не буду приводить пример, как сделать так, что бы удаление срабатывало только если количество записей больше N?
М-да. С триггерами не получится. Извиняюсь за дезинформацию. Внутри триггера нельзя модифицировать таблицу на которой вызывается триггер.
>М-да. С триггерами не получится. Извиняюсь за дезинформацию. Внутри триггера нельзя модифицировать
>таблицу на которой вызывается триггер.Все равно спасибо, узнал про триггеры. В принципе, тот код который я приводил, он работает. Вот только id при вставке новой записи будет увеличиваться +1 (auto_increment)и достигнет своего максимально значения для int это 4294967295. Хотя для моей таблицы это произойдет не скоро, можно использовать bigint вместо int для id.
Видимо, если все-таки id станет максимальным значением, то необходимо создать временную таблицу по аналогии со старой (структура и данные), удалить старую таблицу и переименовать временную таблицу в название старой.
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=2995
Обнуление счетчика можно сделать так:
ALTER TABLE tbl DROP COLUMN id;
ALTER TABLE tbl AUTO_INCREMENT=1
ALTER TABLE tbl ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id);
>Вот только id при вставке новой записи будет
>увеличиваться +1 (auto_increment)и достигнет своего максимально значения для int это 4294967295.Если по одной записи в секунду, то понадобится около 136 лет :)
>>Вот только id при вставке новой записи будет
>>увеличиваться +1 (auto_increment)и достигнет своего максимально значения для int это 4294967295.
>
>Если по одной записи в секунду, то понадобится около 136 лет :)
>У меня одна запись в 15 секунд. Это 2040 лет. Значит не так часто мне придеться обнулять id :)