Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте! У меня есть связка C# и MySQL. В С# запущен бесконечный цикл, который при определенном условии выводит значения в таблицу базы данных, данные обновляются довольно быстро, а старые значения теряют свою актуальность. Отсюда появилась необходимость ограничить количество строк в таблице до 5000, но при этом, чтобы строки продолжали обновляться (т.е чтобы 2-я строка стала 1-й, 5000-я 4999-й, а на место 5000 добавилась новая строка и так далее). Пробовал удалять 1-ю строку функцией (delete from 'table_name' limit1;), но при выводе заполняется 1-я удаленная строка и 5001 строка одним и тем же значением. Не могли бы Вы подсказать, как решить данную проблему?
Неактивен
Поясните на примере из 5 строк, а то не очень понятно.
Неактивен
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();
}
Неактивен
Я имел в виду не код программы, а результат в базе, который вы хотите получить.
Вот у вас есть 5 строк
1 one
2 two
3 three
4 four
5 five
Далее вы удаляете 1 строку и добавляете новую, какой при этом должен быть результат?
Неактивен
2 two
3 three
4 four
5 five
6 six
3 three
4 four
5 five
6 six
7 seven
чтобы сумма строк всегда ровнялась пяти
Неактивен
Повесьте на таблицу триггер, который будет проверять кол-во строк и удалять первую запись.
Но при этом решение вы серьезно усложните процесс записи, т.к. при каждой записи у вас будет ещё выборка и удаление.
Оптимальней, наверное, будет разбить таблицу на партиции по 5000 записей в каждой и периодически (в зависимости от интенсивности записи) удалять старые партиции.
Неактивен
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)
Неактивен
Нет, с точки зрения вашего приложения - это одна таблица.
Просто в базе будет храниться не 5000 строк, а больше. Но это выгодней, чем делать лишнюю проверку и удаление при каждой вставке. По сути, я предлагаю вам периодически проверять размер и удалять лишние записи, а потом они снова будут накапливаться до какого-то предела.
Если же нужно, чтобы было именно 5000 и не более, то триггером или хранимой процедурой.
Неактивен
Спасибо за разъяснения буду копать в этом направлении
Неактивен
Veschiy написал:
я так и сделал, только из C#, вызывал команду "delete from 'table_name' limit1;", но она удаляет только содержание строки и при записи заполняет его снова, получается:
1 six
2 two
3 three
4 four
5 five
6 six
Может это можно как то исправить?
Неактивен
У меня появился еще такой вопрос. Можно ли выводить строку не в конец таблицы, а в начало?
1 one
1 two
2 one
1 three
2 two
3 one
Неактивен
Если Вы не указываете явно сортировку в запросе, то строки буду выведены в произвольном порядке.
Неактивен