Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql]unikalność na poziomie rekordu
totoo
post
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??
Go to the top of the page
+Quote Post
nospor
post
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 ?
Go to the top of the page
+Quote Post
totoo
post
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
Go to the top of the page
+Quote Post
nospor
post
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.
Go to the top of the page
+Quote Post
totoo
post
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 15.05.2008

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


Cytat(nospor @ 15.05.2008, 18:53:54 ) *
nie wiem czy wiesz, ale UNIQUE mozna ustawic na kilka kolumn, czyli defacto zrobic to co chcesz.


Nie wiem gdzie to wyczytałeś, ale ja znalazłem że index unique odpowiada za unikalność na poziomie kolumny a nie wiersza i sprawdziłem że faktycznie tak jest.
Go to the top of the page
+Quote Post
nospor
post
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)
Go to the top of the page
+Quote Post
phpion
post
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.
Go to the top of the page
+Quote Post
Kethrax
post
Post #8





Grupa: Zarejestrowani
Postów: 80
Pomógł: 3
Dołączył: 9.12.2006
Skąd: Kraków

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


Poprostu daj unique do wszystkich kolumn... i masz unikalny wiersz .... (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
dr_bonzo
post
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.
Go to the top of the page
+Quote Post
nospor
post
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)
Go to the top of the page
+Quote Post
azr
post
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.
Go to the top of the page
+Quote Post
nospor
post
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)
Go to the top of the page
+Quote Post
azr
post
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
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 Aktualny czas: 24.12.2025 - 01:44