Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jeśli liczba rekordów >500 w tedy usuń nadmiar
Forum PHP.pl > Forum > Bazy danych > MySQL
expert
Witam,

potrzebuję za pomocą MYSQL kontrolować liczbę rekordów, aby nie przekraczała 500, jeśli przekracza, to nadmiar ma być usuwany. Mam taki kod:
  1. DECLARE `tr` INT DEFAULT 0;
  2. SELECT COUNT(*) INTO tr FROM `users`;
  3. IF tr > 500 THEN
  4. DELETE FROM `users` ORDER BY time ASC LIMIT `tr`;
  5. END IF;

Jednak MYSQL zwraca pusty błąd. Czy ten kod jest poprawny? Chce to wszystko zrobić za pomoca jednago zapytania.
mokry
Zamiast kombinować może coś takiego?

  1. DELETE FROM users
  2. ORDER BY time DESC
  3. LIMIT 500, 18446744073709551615
Crozin
@mokry @expert: Zamiast korzystać z LIMIT i dużego zakresu estetyczniej będzie skorzystać z OFFSET:
  1. DELETE FROM tbl_name ORDER BY col_name ASC OFFSET 500;
expert
"#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OFFSET 500' at line 1"
Crozin
MySQL nie obsługuje zbyt dobrze LIMIT dla zapytań DELETE. Tutaj sposób na obejście tego problemu: http://stackoverflow.com/questions/7142097...ment-with-limit
expert
Tylko, że ja w tabeli nie chce dawać żadnej kolumny typu 'id', a reszta to powtarzające się dane, typu IP.
mokry
@Crozin, co rozumiesz poprzez Twoje stwierdzenie, że MySQL nie radzi sobie zbyt dobrze z LIMIT'em na DELETE?
Crozin
@expert: Nie posiadasz żadnej kolumny pozwalającej unikalnie zidentyfikować rekord? Nie jest to prawdopodobnie najlepszy projekt bazy w takim razie. W czym szkodziłoby dodanie kolumny ID?
@mokry: MySQL obsługuje klauzulę LIMIT w ograniczony sposób dla zapytań typu DELETE, tj. umożliwia jedynie określenie ilości rekordów do usunięcia bez możliwości podania OFFSETu.
expert
CODE
INSERT INTO `users` VALUES ('111.00.00.00', '1357421705', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11', '1357421705', 'glowna', '');
INSERT INTO `users` VALUES ('111.00.00.00', '1357421622', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11', '1357421622', 'glowna', '');
INSERT INTO `users` VALUES ('111.00.00.00', '1357420698', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11', '1357421567', 'glowna, kontakt, galeria', '');
INSERT INTO `users` VALUES ('111.00.00.00', '1357421606', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11', '1357421606', 'glowna', '');
INSERT INTO `users` VALUES ('111.00.00.00', '1357419996', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11', '1357420676', 'glowna, fronty, glowna, kontakt, glowna', '');
INSERT INTO `users` VALUES ('111.00.00.00', '1357421708', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11', '1357421708', 'glowna', '');
INSERT INTO `users` VALUES ('111.00.00.00', '1357421724', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11', '1357421802', 'glowna, fronty', '');
INSERT INTO `users` VALUES ('111.00.00.00', '1357422196', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11', '1357422231', 'glowna, fronty, galeria, glowna, kontakt, glowna, glowna, glowna', '');
INSERT INTO `users` VALUES ('111.00.00.00', '1357425443', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11', '1357425670', 'glowna, fronty', '');
INSERT INTO `users` VALUES ('111.00.00.00', '1357426247', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11', '1357426537', 'glowna, kontakt', 'e5b65df7b09108ca8b4385c3c8782727');
INSERT INTO `users` VALUES ('64.233.160.12', '1357426340', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0', '1357426366', 'glowna, kontakt', 'e7020b45f311d73dff6f0416ddad9f5e');
INSERT INTO `users` VALUES ('123.00.00.00', '1357426569', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0', '1357426572', 'glowna, glowna, glowna, glowna, glowna', '');
INSERT INTO `users` VALUES ('789.00.00.00', '1357431475', 'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)', '1357431475', 'glowna', '');
INSERT INTO `users` VALUES ('789.00.00.00', '1357431476', 'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)', '1357431476', 'glowna', '71812484bd09408fc9e59ea58e221593');
INSERT INTO `users` VALUES ('456.00.00.00', '1357432534', 'Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0', '1357432534', 'glowna', 'fd1a1d245456a2baef94395b50aac9f7');
INSERT INTO `users` VALUES ('123.00.00.00', '1357470133', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0', '1357470133', 'glowna', '');
INSERT INTO `users` VALUES ('123.00.00.00', '1357470790', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0', '1357470790', 'glowna', '');
INSERT INTO `users` VALUES ('123.00.00.00', '1357471625', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0', '1357472070', 'glowna, galeria, kontakt, fronty, glowna, glowna', 'a9957700e2db05165d8800a03a1394c2');


Nie mam z czego utworzyć ID, a dodawać kolejną kolumnę jest bez sensu, bo zakres INT sie kiedyś kończy. Muszę zobaczyć w jednej książce, bo chyba gdzieś sie dodawało sztucznie kolumnę ID w trakcie zapytania.
Crozin
Zakres każdego typu kiedyś się kończy, ale szczerze wątpię by udało Ci się przekroczyć 9.223.372.036.854.775.807 (typ BIGINT) odwiedzin na stronie. A jak widzisz klasyczna kolumna ID już rozwiązała by Ci jeden problem.
viking
A jakim zakresem danych ma być to 500? Bo aż się prosi o trigger before który albo odrzuca dodanie jeżeli jest już powyżej 500, albo usuwa jeden poprzedni rekord.
expert
Cytat(viking @ 6.01.2013, 14:21:36 ) *
A jakim zakresem danych ma być to 500? Bo aż się prosi o trigger before który albo odrzuca dodanie jeżeli jest już powyżej 500, albo usuwa jeden poprzedni rekord.


Po prostu w tabeli ma być 500 najnowszych danych, stare przy dodawaniu mają być kasowane i tyle. Jak nic nie znjadę, co by dawało radę bez dodatkowej kolumny ID to ją dodam.
Crozin
Czy mi się wydaje czy druga i czwarta kolumna to timestamp, którego mógłbyś użyć jako w miarę unikalną kolumnę do usuwania rekordów? Oczywiście użycie zwykłego ID byłoby zdecydowanie lepsze.
expert
Niby tak, ale co w przypadku, kiedy np. 2 boty wejdą w tym samym czasie? Wiem, mało prawdopodne, ale realne.

Kiedyś w Polskich Milionerach był przypadek, jak 2 osoby odpowiedziały najszybciej w tym samym czasie. Niby nie możliwe, ale zdażyło się. :-)
Crozin
Jeżeli czas zapisujesz z precyzją sekundy, istnieje duże prawdopodobieństwo, że będziesz miał tam wiele duplikatów (względem czasu). Między innymi dlatego napisałem, że użycie zwykłej kolumny typu ID będzie lepsze.
Nie rozumiem skąd taka niechęć u Ciebie do wprowadzenia jej. Nie kosztuje Cię to niczego, a ułatwi Ci to znacząco życie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.