The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"MYSQL C API, SQL - запрос"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"MYSQL C API, SQL - запрос"  
Сообщение от Fisher (??) on 05-Май-08, 14:02 
Здравствуйте! Есть таблица 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); //Кол-во записей в tbl

char 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);
}
...

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "MYSQL C API, SQL - запрос"  
Сообщение от Xela email(ok) on 05-Май-08, 17:31 
Вы так путано все объяснили... Но может быть проще незабивать себе голову, а повесить на эту таблицу триггер на insert, который и будет удалять необходимые записи при добавлении новой?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "MYSQL C API, SQL - запрос"  
Сообщение от Fisher (??) on 05-Май-08, 18:13 
>Вы так путано все объяснили... Но может быть проще незабивать себе голову,
>а повесить на эту таблицу триггер на 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)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "MYSQL C API, SQL - запрос"  
Сообщение от Xela email(ok) on 06-Май-08, 09:48 
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 при добавлении записи в таблицу.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "MYSQL C API, SQL - запрос"  
Сообщение от Eye on 06-Май-08, 10:21 
>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, а такой тригер будет срабатывать каждый раз придобавлении записи

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "MYSQL C API, SQL - запрос"  
Сообщение от Xela email(ok) on 06-Май-08, 10:28 
Это тоже не проблема. Только я можно я не буду приводить пример, как сделать так, что бы удаление срабатывало только если количество записей больше N?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "MYSQL C API, SQL - запрос"  
Сообщение от Xela email(ok) on 06-Май-08, 11:22 
М-да. С триггерами не получится. Извиняюсь за дезинформацию. Внутри триггера нельзя модифицировать таблицу на которой вызывается триггер.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "MYSQL C API, SQL - запрос"  
Сообщение от Fisher (??) on 06-Май-08, 13:18 
>М-да. С триггерами не получится. Извиняюсь за дезинформацию. Внутри триггера нельзя модифицировать
>таблицу на которой вызывается триггер.

Все равно спасибо, узнал про триггеры. В принципе, тот код который я приводил, он работает. Вот только id при вставке новой записи будет увеличиваться +1 (auto_increment)и достигнет своего максимально значения для int это 4294967295. Хотя для моей таблицы это произойдет не скоро, можно использовать bigint вместо int для id.

Видимо, если все-таки id станет максимальным значением, то необходимо создать временную таблицу по аналогии со старой (структура и данные), удалить старую таблицу и переименовать временную таблицу  в название старой.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "MYSQL C API, SQL - запрос"  
Сообщение от Fisher (??) on 07-Май-08, 19:50 
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);

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "MYSQL C API, SQL - запрос"  
Сообщение от angra (??) on 07-Май-08, 20:20 
>Вот только id при вставке новой записи будет
>увеличиваться +1 (auto_increment)и достигнет своего максимально значения для int это 4294967295.

Если по одной записи в секунду, то понадобится около 136 лет :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "MYSQL C API, SQL - запрос"  
Сообщение от Fisher (??) on 07-Май-08, 21:16 
>>Вот только id при вставке новой записи будет
>>увеличиваться +1 (auto_increment)и достигнет своего максимально значения для int это 4294967295.
>
>Если по одной записи в секунду, то понадобится около 136 лет :)
>

У меня одна запись в 15 секунд. Это 2040 лет. Значит не так часто мне придеться обнулять id :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру