![]() ![]() |
Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 15.05.2008 Ostrzeżenie: (0%)
|
nie wiem jak zapewnić unikalność w rekordzie w tabeli, w której trzymam kilka kluczy obcych(tych samych), chcem aby baza danych zachowala spójność, a nie wadlizować poprawność wpisu przez php. Potrzebuje, aby rekord zawierał unikalne klucze obce. Zastanawiałem się czy może transakcja będzie mogła to wykonać, bo trigger raczej odpada,
Co sądzicie na ten temat?? |
|
|
|
Post
#2
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Nic nie kumam z tego opisu...
A nie mozesz uzyc UNIQUE ? |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 15.05.2008 Ostrzeżenie: (0%)
|
unique da mi unikalność na poziomie kolumny a nie na poziomie wiersza,
podam przykład zastosowania: tabela pierwsza ma pracowników tabela druga projekty, każdy projekt ma kilku pracowników, ale pracownicy w projekcie nie mogą sie powtarzać, jakim sposobem można zapewnić takie warunki w bazie by była spójna (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) Ten post edytował totoo 15.05.2008, 17:52:03 |
|
|
|
Post
#4
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Cytat unique da mi unikalność na poziomie kolumny a nie na poziomie wiersza, nie wiem czy wiesz, ale UNIQUE mozna ustawic na kilka kolumn, czyli defacto zrobic to co chcesz.
|
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 15.05.2008 Ostrzeżenie: (0%)
|
|
|
|
|
Post
#6
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
wiesz, wyczytalem w manualu i spowodzeniem stosuje to w moim aplikacjach uzyskujac wlasnie to co chcesz osiągnąć. Ale skoro nie to nie... twoj problem, a ja ide oglądac film (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
|
Post
#7
|
|
|
Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza |
@totoo:
Polecam zapoznanie się z http://dev.mysql.com/doc/refman/5.0/en/create-index.html. Następnym razem może nie wymądrzaj się jeżeli pomocy udziela ci ktoś, kto ma troszke większą wiedzę od twojej. Gdybyś miał problem ze zlokalizowaniem konkretnego miejsca w dokumentacji: Kod ON tbl_name (index_col_name,...) konkretnie chodzi o te kropeczki. |
|
|
|
Post
#8
|
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 3 Dołączył: 9.12.2006 Skąd: Kraków Ostrzeżenie: (10%)
|
Poprostu daj unique do wszystkich kolumn... i masz unikalny wiersz .... (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
|
|
|
|
Post
#9
|
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%)
|
Koledzy, z tego co wyczytalem
Cytat podam przykład zastosowania: tabela pierwsza ma pracowników tabela druga projekty, każdy projekt ma kilku pracowników, ale pracownicy w projekcie nie mogą sie powtarzać, To kolega ma relacje wiele do wielu, przy czym nie uzywa 3ciej tabeli - i wszystko trzyma w jednym polu rekordu projekt (porazka!). Totoo: dorob 3cia tabele: pracownik_w_projekcie: ( projekt_id, pracownik_id, ....) i klucz unique (projekt_id, pracownik_id). That's all. |
|
|
|
Post
#10
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Cytat Totoo: dorob 3cia tabele: pracownik_w_projekcie: ( projekt_id, pracownik_id, ....) i klucz unique (projekt_id, pracownik_id). That's all. Ja osobiscie zrozumialem ze tak wlasnie zrobil, tylko nie dal tych nieszczesnych UNIQUE (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
|
Post
#11
|
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 16.05.2008 Ostrzeżenie: (0%)
|
Rozumiem że cchesz zrobić to tak :
w tabeli 2 lub 3 kolumny są tym samym kluczem obcym ale chesz zpewnic zeby nie powtarzały sie w danym rekordzie? jeśli tak to tylko trigger i sprawdzenie warunków Cytat Poprostu daj unique do wszystkich kolumn... i masz unikalny wiersz .... (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) no chyba nie do końca: analizując przykład z pracownikami i projektami: tabela powiazań mialaby ma strukture: projekt ( FK z tablicy projektow ) | pracownik 1 (FK z tablicy pracownicy ) | pracownik 2 (FK z tablicy pracownicy ) i chcesz zapewnic ze jeden pracownik nie moze w pojedynke zajmowac sie projektem na 'dwa etetay' ale moze figurować w kilku proejtach róznych . Powyższe rozumowanie ( UNIQUE na kazdej z kolumn doprowadziloby do sytuacji ze do kazdego z projektow musiałby byc osobny zestaw pracowników. przykład : projekt | prac1 | prac2 ----------------------------- 0001 | p22 | p11 0002 | p33 | p15 0003 | p22 | p34 <- ten wpis jest poprawny ale nie mozemy go wpisać bo jest ustawione unique na klumnie prac1! a chodziło chyba o to żeby nie mozna bylo wstawić 0004 | p09 | p09 w dodatku unique na projekt blokuje nam mozliwosc pzypisanie np 4 odob do jednego projektu - ale to moze nie jest konieczne, niewiem. takze - relacje + triggery IMHO jedyne opcja. |
|
|
|
Post
#12
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Cytat tabela powiazań mialaby ma strukture: projekt ( FK z tablicy projektow ) | pracownik 1 (FK z tablicy pracownicy ) | pracownik 2 (FK z tablicy pracownicy ) @azr ta tabela to cos nie teges. A jak bedziesz chcial 3 pracownikow? Dodasz kolejne pole? A jak czterech? znowu dodasz? A jak 100?.... To co napisal dr_bonzo to najlepsze rozwiązanie + UNIQUE na oba POLA. Dawanie tutaj triggerow to lekkie nieporozumienie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
|
Post
#13
|
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 16.05.2008 Ostrzeżenie: (0%)
|
tabela z dwoma pracownikami to tylko przykład. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
zawsze mozna zrezygnować z unique na projekt i mieć tyle par ile sie chce ze wspolnym projetkm, chociaz to faktycznie pokrecone (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) ale mowie to tylko przyklad gdyby chciać miec ograniczona licze pracowikow. jeśli założy sie UNIQUE na oba pola wspólnie to faktycznie bedzie to spełaniało swoje zadanie (jeśli index na obydwu polach razem będzie działał jak sklejenie). wcześnie zrozumiałem ze unique ma być założone _osobno_ na każdą z kolumn. EDIT : to chyba wyczerpuje temat i przy okazji totoo masz tez dodatkowe informacje o potencjalnym problemie. Cytat CREATE TABLE
newTable ( field1 INT(11) , field2 INT(11) , field3 VARCHAR(5) , field4 BLOB , PRIMARY KEY (field2, field1, field3) <==== ) In other words: You have to declare KEY's spreading over multiple columns in a seperate definition line. This implicitly means, that such a multiple PRIMARY KEY can't use AUTO_INCREMENT. One Problem is, that each multiple column KEY is only allowed to spread 16 columns. In your example this isn't a problem (as you only use 3 columns). The second catch is the maximum overall length of 256 Bytes. Ten post edytował azr 16.05.2008, 13:44:56 |
|
|
|
![]() ![]() |
|
Aktualny czas: 24.12.2025 - 01:44 |