Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Autonumeracja a klucze obce
Kikert
post 4.09.2010, 13:30:28
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 15.09.2008

Ostrzeżenie: (0%)
-----


Małe pytanie - jeżeli dla klucza podstawowego z numerem użytkownika ustawię opcję 'Auto Incremental' to czy:

1. Numeracja będzie się zmieniać automatycznie przy różnych operacjach (np. usunięciu użytkownika), tak, że wartości kolejnych rekordów będą zawsze tworzyć ciąg liczb naturalnych (1,2,3,...)?

2. Czy przy takich zmianach klucze obce w innych tabelach również będą się odpowiednio zmieniać?
Go to the top of the page
+Quote Post
yevaud
post 4.09.2010, 13:33:30
Post #2





Grupa: Zarejestrowani
Postów: 471
Pomógł: 89
Dołączył: 29.07.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(Kikert @ 4.09.2010, 14:30:28 ) *
1. Numeracja będzie się zmieniać automatycznie przy różnych operacjach (np. usunięciu użytkownika), tak, że wartości kolejnych rekordów będą zawsze tworzyć ciąg liczb naturalnych (1,2,3,...)?

nie

Cytat(Kikert @ 4.09.2010, 14:30:28 ) *
2. Czy przy takich zmianach klucze obce w innych tabelach również będą się odpowiednio zmieniać?


to zalezy
http://dev.mysql.com/doc/refman/5.1/en/inn...onstraints.html
on delete, on update
Go to the top of the page
+Quote Post
cojack
post 4.09.2010, 22:12:35
Post #3





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Stosując on delete, czy on update, można sobie samemu krzywdy narobić... Także nie polecam.


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
Kikert
post 4.09.2010, 22:19:56
Post #4





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 15.09.2008

Ostrzeżenie: (0%)
-----


Poczytałem trochę, podumałem, ale dalej nie jestem w stanie niczego wymyślić. Poniżej treść mojego posta z innego forum:

OK, narazie jest fajnie, jednak wszędzie temat jest opisany dosyć ogólnikowo, w związku z czym proszę o pomoc.

Udało mi się dowiedzieć, że chodzi tutaj o kod ON DELETE i ON ACTION w kodzie SQL.

Chciałbym się dowiedzieć, jaki będzie prawidłowy kod SQL tworzący tabele bazy danych w moim przypadku. Chciałbym, aby w sytuacji, kiedy zostanie usunięty lub zmieniony numer ID użytkownika, klucz obcy w tabeli str_messages_receivers został usunięty lub nadpisany.

Fragment diagramu EER (klucze podstawowe to klucze , a obce to czerwone romby):



Kod dla tabeli str_users:
  1. CREATE TABLE IF NOT EXISTS `starter`.`str_users` (
  2. `user_id` INT NOT NULL ,
  3. `name` VARCHAR(50) NOT NULL ,
  4. `username` VARCHAR(20) NOT NULL ,
  5. `password` CHAR(40) NOT NULL ,
  6. `mail` VARCHAR(50) NOT NULL ,
  7. `access_id` TINYINT NOT NULL ,
  8. `ban` TINYINT(4) NOT NULL DEFAULT 0 ,
  9. PRIMARY KEY (`user_id`) ,
  10. INDEX `users_to_groups_access_access` (`access_id` ASC) ,
  11. CONSTRAINT `users_to_groups_access_access`
  12. FOREIGN KEY (`access_id` )
  13. REFERENCES `starter`.`str_groups_access` (`access_id` )
  14. ON DELETE NO ACTION
  15. ON UPDATE NO ACTION)
  16. ENGINE = InnoDB


Kod dla tabeli str_message_receivers:
  1. CREATE TABLE IF NOT EXISTS `starter`.`str_message_receivers` (
  2. `message_id` INT NOT NULL ,
  3. `user_id` INT NOT NULL ,
  4. `read` TINYINT(4) NULL ,
  5. INDEX `fk_str_message_receivers_str_messages1` (`message_id` ASC) ,
  6. INDEX `fk_str_message_receivers_str_users1` (`user_id` ASC) ,
  7. CONSTRAINT `fk_str_message_receivers_str_messages1`
  8. FOREIGN KEY (`message_id` )
  9. REFERENCES `starter`.`str_messages` (`message_id` )
  10. ON DELETE NO ACTION
  11. ON UPDATE NO ACTION,
  12. CONSTRAINT `fk_str_message_receivers_str_users1`
  13. FOREIGN KEY (`user_id` )
  14. REFERENCES `starter`.`str_users` (`user_id` )
  15. ON DELETE NO ACTION
  16. ON UPDATE NO ACTION)
  17. ENGINE = InnoDB


Koniec posta. Chciałbym się również zapytać, czy można jakoś te więzy integralności ustawić w MySQL Workbench, wtedy mógłbym sobie sam popróbować.
Go to the top of the page
+Quote Post
yevaud
post 5.09.2010, 01:06:04
Post #5





Grupa: Zarejestrowani
Postów: 471
Pomógł: 89
Dołączył: 29.07.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


ON DELETE CASCADE
ON UPDATE CASDADE

Cytat
Chciałbym się również zapytać, czy można jakoś te więzy integralności ustawić w MySQL Workbench, wtedy mógłbym sobie sam popróbować.

tak mozna


Cytat(cojack @ 4.09.2010, 23:12:35 ) *
Stosując on delete, czy on update, można sobie samemu krzywdy narobić... Także nie polecam.

dlaczego ?
ja polecam smile.gif krzywde mozna sobie zrobic nawet dlubiac w nosie smile.gif
niezla krzywde mozna sobie tez zrobic trzymajac niespojna baze z nieaktualnymi kluczami

po to sa wiezy integralnosci zeby baza zachowala integralnosc, jesli masz uprawnienia ktore pozwalaja na np. kasowanie/updatowanie rekordow to musisz liczyc sie z tym, ze rekordy zostana skasowane/updatowane tak zeby baza zachowala integralnosc :] inna sprawa, ze warto sie dobrze zastanowic czy to czego potrzebujemy to na pewno jest delete rekordow, a nie zmiana ich(na przyklad) statusu na nieaktywny

Ten post edytował yevaud 5.09.2010, 01:13:33
Go to the top of the page
+Quote Post
cojack
post 5.09.2010, 08:35:08
Post #6





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Prosty przykład dlaczego nie:

Sklep, produkty, faktury.

Mamy jakis produkt na stanie, dodajemy go do faktury, zostal zdjety z stanu ma teraz ilosc sztuk magazynowa 0, uwazamy ze juz jest nam nie potrzebny, wiec usuwamy go. BUM!
Z faktury znika nam produkt! Tadam! A później urzad skarbowy nas za jaja powiesi.


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
yevaud
post 5.09.2010, 12:03:56
Post #7





Grupa: Zarejestrowani
Postów: 471
Pomógł: 89
Dołączył: 29.07.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


ok, ale przy takiej konkstrukcji bazy jaka mysle narzuca Twoj scenariusz, po zrobieniu delete cascade nie tyle zniklby produkt z faktur co zniklyby faktury ktore ten produkt mialy smile.gif produkt z faktur zniklby nawet wtedy gdy cascade by nie bylo, a na dodatek mialbys spaprana baze bo faktury przy zlaczeni inner i tak by znikly

Kazdy kto kasuje rekordy w ten sposob o ktorym wspomniales zasluguje na pregierz i cascade niewiele tu zmienia, set null mogloby cos zmienic ewentualnie tzn. sprawic ze w pewnych warunkach byloby to dopuszczalne

Program do faktur albo powinien byc zlaczany wiele-do-wielu z magazynem, wtedy kasujesz rekordy z tabeli zlaczajacej, a za skasowanie czegos z tabeli produktow masz dyscyplinarne zwolnienie z pracy(wtedy bez cascade uszkadzalbys wszystkie faktury, z cascade kasowalbys produkt z wszystkich faktur - same faktury dalej by istnialy i bylyby formalnie poprawne) smile.gif, albo i tak powinien kopiowac wszystkie dane na fakture -> po to ze jak zmienisz nazwe produktu w magazynie to Ci wstecz wszystkich faktur nie miesza smile.gif W przypadku drugim mozna pozostawic klucze obce wiele-do-wielu, ale raczej jako informacja dla admina bazy danych i wtedy w on delete powinno byc set null, a bez on delete znow masz burdel w bazie smile.gif

Ten post edytował yevaud 5.09.2010, 12:10:04
Go to the top of the page
+Quote Post
cojack
post 5.09.2010, 14:33:07
Post #8





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Gdyby nie było on delete cascade, baza by Ci nie pozowoliła usunąć produktu, ponieważ inne pola (klucze obce) pokazywałyby na wartość w tabeli której nie ma, integralność kluczy jest ważnym elementem i Twoją obroną. Także czasami warto się zastanowić nad tym co tak na prawdę robimy.


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
Kikert
post 5.09.2010, 19:47:25
Post #9





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 15.09.2008

Ostrzeżenie: (0%)
-----


I rozumiem, że to w tabeli str_message_receivers w tym przypadku?
Go to the top of the page
+Quote Post
nospor
post 6.09.2010, 11:01:32
Post #10





Grupa: Moderatorzy
Postów: 36 556
Pomógł: 6314
Dołączył: 27.12.2004




Cytat
Stosując on delete, czy on update, można sobie samemu krzywdy narobić... Także nie polecam.

Cytat
Mamy jakis produkt na stanie, dodajemy go do faktury, zostal zdjety z stanu ma teraz ilosc sztuk magazynowa 0, uwazamy ze juz jest nam nie potrzebny, wiec usuwamy go. BUM!
Z faktury znika nam produkt! Tadam! A później urzad skarbowy nas za jaja powiesi.
Cojak, jeśli tak używasz relacji to nic dziwnego ze ich nie polecasz winksmiley.jpg
W tym przypadku na tabele faktura_produkt nalezy zalozyc klucz obcy na produkt z ondelete RESTRICT. Wowczas baza nie pozwoli na usunięcie produktu, który jest przypisany do jakiejs faktury. Relacje to bardzo fajny mechanizm i jak najbardziej nalezy go stosować.

Takie rozwiązanie jest tym bardziej wskazane, że daje nam zabezpieczenie, gdy jakiś "genialny" admin ominie aplikacje i jej logikę i zacznie grzebać bezpośrednio w bazie. Wówczas również gdy będzie chciał bezpośrednio w bazie usunąć produkt, to baza mu na to nie pozwoli, jeśli produkt będzie przypisany do jakiejś faktury


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 7.05.2025 - 05:49