SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.02.2012 23:44:05

Veschiy
Участник
Зарегистрирован: 15.02.2012
Сообщений: 6

как ограничить колличество строк в таблице?

Здравствуйте! У меня есть связка C# и MySQL. В С# запущен бесконечный цикл, который при определенном условии выводит значения в таблицу базы данных, данные обновляются довольно быстро, а старые значения теряют свою актуальность. Отсюда появилась необходимость ограничить количество строк в таблице до 5000, но при этом, чтобы строки продолжали обновляться (т.е чтобы 2-я строка стала 1-й, 5000-я 4999-й, а на место 5000 добавилась новая строка и так далее). Пробовал удалять 1-ю строку функцией (delete from 'table_name' limit1;), но при выводе заполняется 1-я удаленная строка и 5001 строка одним и тем же значением. Не могли бы Вы подсказать, как решить данную проблему?

Неактивен

 

#2 15.02.2012 23:48:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: как ограничить колличество строк в таблице?

Поясните на примере из 5 строк, а то не очень понятно.

Неактивен

 

#3 16.02.2012 00:12:10

Veschiy
Участник
Зарегистрирован: 15.02.2012
Сообщений: 6

Re: как ограничить колличество строк в таблице?

a,b,c,d,e,f - постоянно обновляются

string ComInsert = "INSERT INTO table(a,b,c,d,e,f) values(@a,@b,@c,@d,@e,@f);";
string ComCol = "SELECT COUNT(*) FROM table;";
string ComDel = "DELETE FROM table LIMIT1";

MySqlCommand commandCol = new MySqlCommand(ComCol, dbConn);
string col = commandCol.ExecuteScalar().ToString();
int col4 = int.Parse(col);
int col3 = col4 - 1;

string ComSelect = "SELECT date FROM table LIMIT " + col3 + ",1;";
MySqlCommand commandSelect = new MySqlCommand(ComSelect, dbConn);
string stringA = commandSelect.ExecuteScalar().ToString();
int a2 = int.Parse(stringA);
if (a != a2)
{
    MySqlCommand commandInsert = new MySqlCommand(ComInsert, dbConn);
        commandInsert.Parameters.Add("@a", MySqlDbType.DateTime).Value = a;
        commandInsert.Parameters.Add("@b", MySqlDbType.Double).Value = b;
        commandInsert.Parameters.Add("@c", MySqlDbType.Double).Value = c;
        commandInsert.Parameters.Add("@d", MySqlDbType.Double).Value = d;
        commandInsert.Parameters.Add("@e", MySqlDbType.Double).Value = e;
        commandInsert.Parameters.Add("@f", MySqlDbType.Int32).Value = f;
        commandInsert.ExecuteNonQuery();
}
if (col4 == 5000)
{
    MySqlCommand commandDel = new MySqlCommand(ComDel, dbConn);
    commandUpdate.ExecuteNonQuery();
}

Неактивен

 

#4 16.02.2012 00:19:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: как ограничить колличество строк в таблице?

Я имел в виду не код программы, а результат в базе, который вы хотите получить.
Вот у вас есть 5 строк
1 one
2 two
3 three
4 four
5 five

Далее вы удаляете 1 строку и добавляете новую, какой при этом должен быть результат?

Неактивен

 

#5 16.02.2012 00:22:49

Veschiy
Участник
Зарегистрирован: 15.02.2012
Сообщений: 6

Re: как ограничить колличество строк в таблице?

2 two
3 three
4 four
5 five
6 six

3 three
4 four
5 five
6 six
7 seven

чтобы сумма строк всегда ровнялась пяти

Неактивен

 

#6 16.02.2012 00:36:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: как ограничить колличество строк в таблице?

Повесьте на таблицу триггер, который будет проверять кол-во строк и удалять первую запись.
Но при этом решение вы серьезно усложните процесс записи, т.к. при каждой записи у вас будет ещё выборка и удаление.

Оптимальней, наверное, будет разбить таблицу на партиции по 5000 записей в каждой и периодически (в зависимости от интенсивности записи) удалять старые партиции.

Неактивен

 

#7 16.02.2012 00:46:07

Veschiy
Участник
Зарегистрирован: 15.02.2012
Сообщений: 6

Re: как ограничить колличество строк в таблице?

vasya написал:

Повесьте на таблицу триггер, который будет проверять кол-во строк и удалять первую запись.
Но при этом решение вы серьезно усложните процесс записи, т.к. при каждой записи у вас будет ещё выборка и удаление.

я так и сделал, только из C#, вызывал команду "delete from 'table_name' limit1;", но она удаляет только содержание строки и при записи заполняет его снова, получается:
1 six
2 two
3 three
4 four
5 five
6 six
Может это можно как то исправить?

vasya написал:

Оптимальней, наверное, будет разбить таблицу на партиции по 5000 записей в каждой и периодически (в зависимости от интенсивности записи) удалять старые партиции.

Тогда мне придется из основного кода продумывать алгоритм обращения к нескольким партиям, потому что для расчетов мне нужны все 5000 строк

Отредактированно Veschiy (16.02.2012 00:47:47)

Неактивен

 

#8 16.02.2012 00:52:58

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: как ограничить колличество строк в таблице?

Нет, с точки зрения вашего приложения - это одна таблица.
Просто в базе будет храниться не 5000 строк, а больше. Но это выгодней, чем делать лишнюю проверку и удаление при каждой вставке. По сути, я предлагаю вам периодически проверять размер и удалять лишние записи, а потом они снова будут накапливаться до какого-то предела.

Если же нужно, чтобы было именно 5000 и не более, то триггером или хранимой процедурой.

Неактивен

 

#9 16.02.2012 00:58:24

Veschiy
Участник
Зарегистрирован: 15.02.2012
Сообщений: 6

Re: как ограничить колличество строк в таблице?

Спасибо за разъяснения буду копать в этом направлении

Неактивен

 

#10 16.02.2012 01:01:39

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: как ограничить колличество строк в таблице?

Veschiy написал:

я так и сделал, только из C#, вызывал команду "delete from 'table_name' limit1;", но она удаляет только содержание строки и при записи заполняет его снова, получается:
1 six
2 two
3 three
4 four
5 five
6 six
Может это можно как то исправить?

delete from `table_name` limit1;
Удалит одну строку - произвольную (не факт, что первую).
Что касается "заполняет снова", это результат действия вашей программы, которая добавляет 2 строки. В C# не силен, поэтому указать на ошибку не могу.

Неактивен

 

#11 16.02.2012 14:04:43

Veschiy
Участник
Зарегистрирован: 15.02.2012
Сообщений: 6

Re: как ограничить колличество строк в таблице?

У меня появился еще такой вопрос. Можно ли выводить строку не в конец таблицы, а в начало?

1 one

1 two
2 one

1 three
2 two
3 one

Неактивен

 

#12 16.02.2012 19:09:51

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: как ограничить колличество строк в таблице?

Если Вы не указываете явно сортировку в запросе, то строки буду выведены в произвольном порядке.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson