konto usunięte

Temat: mysql i usuwanie rekordów

Witam. Mam pytanie dotyczące usuwania rekordów z tabeli.

Przy tworzeniu nowych rekordów ID jest tworzone dzięki własności AutoIncrement. Tabela wygląda więc tak:

ID|nazwa|
1 |obj1 |
2 |obj2 |
3 |obj3 |

Gdy jednak usuniemy obiekt o ID=1 oraz dodamy kolejny rekord, tabela wygląda tak:

ID|nazwa|
2 |obj2 |
3 |obj3 |
4 |obj4 |

Chciałbym się dowiedzieć czy jest możliwość aby pierwszy element w tabeli miał ZAWSZE id=1 a reszta 2,3,4 itd. ?

Oraz drugie pytanie -> w jaki sposób zamienić miejscami 2 rekordy? Tak żeby np. obiekt o id=4 był nad obiektem o id=3 i analogicznie wyświetlony został na stronie wcześniej.
Robert Nodzewski

Robert Nodzewski Tworzenie serwisów
www oraz paneli do
zarządzania/raporto.
..

Temat: mysql i usuwanie rekordów

Te "dziury" o których mówisz to normalna rzecz i nie ma co się nimi przejmować a już tym bardziej je wypełniać. ID to ID, powinno być unikalne a nie że raz pod danym ID jest jeden rekord a za chwilę pod danym ID jest zupełnie inny rekord.

Wnioskuję po Twojej dalszej wypowiedzi, że chcesz określać kolejność rekordów. To poprostu dodaj kolejne pole które będzie określało kolejność i to właśnie te pole modyfikuj. Id zostaw w spokoju :)
Tomasz Wójtowicz

Tomasz Wójtowicz Programista Ruby on
Rails

Temat: mysql i usuwanie rekordów

Czytałem też gdzieś, że powinno się id losować a nie inkrementować jeden po drugim :P
Robert Nodzewski

Robert Nodzewski Tworzenie serwisów
www oraz paneli do
zarządzania/raporto.
..

Temat: mysql i usuwanie rekordów

Jakieś bzdury czytałeś lub wyrwałeś to zdanie z kontekstu całej większej dyskusji.

Owszem, ma to jakieś uzasadnienie przy serwisach typu nasza-klasa, gdzie dobrze by było, by ID usera to nie były pokolei liczby, bo łatwo można wówczas "przelecieć wszystkich użytkowników" ;) W omawianej tu sytuacji nie ma raczej żadnego uzasadnienie, patrząc co ma się dziać z tymi rekordami.Robert Nodzewski edytował(a) ten post dnia 08.02.11 o godzinie 09:58
Tomasz Wójtowicz

Tomasz Wójtowicz Programista Ruby on
Rails

Temat: mysql i usuwanie rekordów

Tzn wlasnie chodzilo mi o to ze wieksze serwisy stosuja losowanie id zamiast inkrementacje (czyli przy wiekszych serwisach zaleca sie ta praktyke). Wiec ma to zwiazek do pytania Wojciecha ze nie ma znaczenia ze powstaja "dziury"Tomasz Wójtowicz edytował(a) ten post dnia 08.02.11 o godzinie 10:43

konto usunięte

Temat: mysql i usuwanie rekordów

Dzięki za odpowiedzi, a teraz mam drugie pytanie. Napisałem taki SQL:


$sql = "DELETE FROM ".self::$table_name.",articles";
$sql .=" USING ".self::$table_name;
$sql .=" INNER JOIN articles";
$sql .=" WHERE categories.id='".$database->escape_value($this->id)."' OR categories.name = articles.cattegory_name AND articles.cattegory_name = categories.name;";


Generalnie chcę zbudować automat, który w momencie usunięcia kategorii usunie także wszystkie newsy, które w niej były. Skrypt mi działał, ale tylko gdy w danej kategorii był jakikolwiek news. Pustej kategorii nie usuwa.
Robert Nodzewski

Robert Nodzewski Tworzenie serwisów
www oraz paneli do
zarządzania/raporto.
..

Temat: mysql i usuwanie rekordów

1) Takie rzeczy najlepiej robi się przez relacje na bazie. Usuwając kategorię, baza sama usunie newsy z tej kategorii. Poczytaj o typie InnoDB oraz relacjach
2) Jeśli olejesz punkt pierwszy, to zrób to poprostu dwoma zapytaniami. Pierwsze usuwające kategorię, a drugie usuwające newsy z tej kategorii.
Piotrek Kaźmierczak

Piotrek Kaźmierczak sky is the limit...

Temat: mysql i usuwanie rekordów

ad 2)
lepiej imho najpierw newsy z kategorii, a później kategorie

pzdr
Jarek W.

Jarek W. Software Engineer

Temat: mysql i usuwanie rekordów

Tomasz Wójtowicz:
Tzn wlasnie chodzilo mi o to ze wieksze serwisy stosuja losowanie id zamiast inkrementacje (czyli przy wiekszych serwisach zaleca sie ta praktyke). Wiec ma to zwiazek do pytania Wojciecha ze nie ma znaczenia ze powstaja "dziury"Tomasz Wójtowicz edytował(a) ten post dnia 08.02.11 o godzinie 10:43

Ale to również można osiągnąć w sposób, który opisał Robert - po prostu jak chcesz identyfikować użytkownika w serwisie, to oprócz tego, że ma on id, możesz powiązać z tym jakąś losową i unikalną liczbę (lub napis), która jest trzymana w dodatkowej kolumnie.
Jarek W.

Jarek W. Software Engineer

Temat: mysql i usuwanie rekordów

Piotrek Kaźmierczak:
ad 2)
lepiej imho najpierw newsy z kategorii, a później kategorie

pzdr

A możesz podać uzasadnienie?

EDIT:

A, dobra, to w kontekście wypowiedzi Roberta - już Cię rozumiem. :-)Jarek W. edytował(a) ten post dnia 08.02.11 o godzinie 13:01
Roman Jaworski

Roman Jaworski Manager/Team
Leader/Web
Developer/Programist
a

Temat: mysql i usuwanie rekordów

Robert Nodzewski:
1) Takie rzeczy najlepiej robi się przez relacje na bazie. Usuwając kategorię, baza sama usunie newsy z tej kategorii. Poczytaj o typie InnoDB oraz relacjach

Zdecydowanie jestem za pkt. 1. Używając InnoDB w kluczach obcych ustawiłbym ON DELETE na Cascade. Korzystaj z tego. Po to jest.
2) Jeśli olejesz punkt pierwszy, to zrób to poprostu dwoma zapytaniami. Pierwsze usuwające kategorię, a drugie usuwające newsy z tej kategorii.

Tutaj dołączyłbym jeszcze transakcję dla pewności wykonania obydwu zapytań.

konto usunięte

Temat: mysql i usuwanie rekordów

Używanie ON DELETE CASCADE jest mało bezpiecznie w niektórych przypadkach, można się pozbyć ważnych danych i zepsuć sobie bazę (w sensie informacje w niej).

konto usunięte

Temat: mysql i usuwanie rekordów

Przemek Czekaj:
Używanie ON DELETE CASCADE jest mało bezpiecznie w niektórych przypadkach, można się pozbyć ważnych danych i zepsuć sobie bazę (w sensie informacje w niej).

a co lepsze skasować ważne dane czy skasować klucze do ważnych danych i zastanawiać się co te dane oznaczają?

powiem tak kiepsko skonstruowane zapytanie SQL może pokaleczyć, ale to nie wina SQL-a tylko operatora
Robert Nodzewski

Robert Nodzewski Tworzenie serwisów
www oraz paneli do
zarządzania/raporto.
..

Temat: mysql i usuwanie rekordów

Przemek Czekaj:
Używanie ON DELETE CASCADE jest mało bezpiecznie w niektórych przypadkach, można się pozbyć ważnych danych i zepsuć sobie bazę (w sensie informacje w niej).
No jak ktoś nie wie po co zakłada relacje to pewnie, że jest to niebezpieczne. Tak samo jak trzymanie naładowanej strzelby przez dziecko :)
A jak ktoś wie po co zakłada te relacje to wie i wie czego ma oczekiwać w danej sytuacji.
Wojciech K.

Wojciech K. realizator pomysłów
własnych

Temat: mysql i usuwanie rekordów

Tomasz Wójtowicz:
Tzn wlasnie chodzilo mi o to ze wieksze serwisy stosuja losowanie id zamiast inkrementacje (czyli przy wiekszych serwisach zaleca sie ta praktyke).

jesli jest pole typu auto_increment, to niech takie będzie - wyręczanie bazy i losowanie jego wartości jest niepotrzebną stratą zasobów - nikt nie każe używać tego id w serwisie w URLach i innych widocznych parametrach...

do takich rzeczy tworzy się osobny identyfikator, który buduje się np. na zasadzie:
id*1000 + liczba losowa z przedziału 000-999

Następna dyskusja:

Usuwanie zdublowanych rekor...




Wyślij zaproszenie do