konto usunięte

Temat: Check constraint w MySQL?

Cześć,
Mam mały problem z bazą MySQL, a dokładnie chodzi mi o uściślenie danych wprowadzanych do bazy (check constraint). Mam zainstalowaną bazę w wersji 5.0.51b w paczce oprogramowania Vertrigo. Powiedzmy, że struktura bazy wygląda tak:

id | pole_1 | pole_2 |

Wykonałem takie zapytanie do bazy:

SET sql_mode = 'STRICT_TRANS_TABLES';
SET sql_mode = 'STRICT_ALL_TABLES';


a następnie:


ALTER TABLE test
ADD CONSTRAINT chk_test CHECK (pole_1 = 'S' AND pole_2 IS NOT NULL);


Zapytanie wykonało się poprawnie, więc myślałem, że ograniczenie już działa. Okazało się, że mogę wprowadzać dowolną kombinację danych i tak jakby check nie istniał. Zrobiłem eksport tabeli i ku mojemu zdziwieniu nie ma tam żadnego checka, a przecież jeżeli został utworzony to powinien dać się wyeksportować.

Czy ktoś może ma doświadczenie ze wspomnianym zagadnieniem i pomoże wskazać błąd w moich działaniach?
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Check constraint w MySQL?

The CHECK clause is parsed but ignored by all storage engines.

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Sorry

konto usunięte

Temat: Check constraint w MySQL?

Tak, też to znalazłem. Ale nie istnieje jakiś sposób na to? Może zakombinować coś z triggerami?
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Check constraint w MySQL?

Zdecydowanie można, aczkolwiek do wersji 5.5 (która jeszcze nie jest GA) sposób jest trochę pokrętny. Chodzi o to, żeby w triggerze po stwierdzeniu, że dane nie spełniają założonego warunku wygenerować błąd, który zostanie zwrócony do aplikacji i można go jakoś obsłużyć. Ja robię sobie specjalną tabelę 'errors' z kolumnami 'id','opis'. Gdy chcę wywołać błąd, to wstawiam do tej tabeli id które już jest.
Łukasz P.

Łukasz P. Student, Akademia
Ekonomiczna im.
Oskara Langego we
Wrocł...

Temat: Check constraint w MySQL?

Hej, ostatnio zmagam się z tym samym problemem, rozumiem, że Twój sposób polega na takim myku, że wyzwalacz próbuje wstawić do tabeli wartość oznaczoną jako PRIMARY KEY którą będzie dublowana i dzięki temu uzyskuje się błąd i nie dochodzi do polecenia INSERT. Ja potrzebuję stworzyć taki ala CHECK, który sprawdzi czy wprowadzana wartość spełnia założenia wzorca.
Michał mógłbyś napisać treść tego wyzwalacza i co on Ci wpisuje do pola 'opis'?. Ja myślałem, że zrobię tabele error o jednym polu z jedną wartością np. '1' oznaczę jako PRIMARY KEY i w przypadku nie dopasowania do wzorca każę zrobić insert '1' do tabeli error.
Michał Bukarowicz

Michał Bukarowicz Student, Wyższa
Szkoła Informatyki w
Łodzi

Temat: Check constraint w MySQL?

to ja może się podłącze do dyskusji. Mam podobny problem. Stworzyłem tabele filmy i dodałem warunek, że kolumna data_produkcji nie może być starsza niż 1980-01-01, taki kod , alter table filmy add constraint data_produkcji_spr check (gatunek_produkcji >='1980-01-01'); a gdy dodawałem dane wpisałem data produkcji poniżej 1980 i baza mi zaakceptowała. Gdzie jest błąd ?
Tomasz Zadora

Tomasz Zadora programuję

Temat: Check constraint w MySQL?

Błąd jest taki, że lepiej to robić na poziomie aplikacji niż bazy ;-) Z wielu powodów - np. takiego, że lepiej możesz obsłużyć tak błąd, pisząc wprowadzającemu co konkretnie zrobił źle a nie, że "wystąpił błąd bazy danych".
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Check constraint w MySQL?

Tomasz Zadora:
Błąd jest taki, że lepiej to robić na poziomie aplikacji niż bazy ;-) Z wielu powodów - np. takiego, że lepiej możesz obsłużyć tak błąd, pisząc wprowadzającemu co konkretnie zrobił źle a nie, że "wystąpił błąd bazy danych".

I masz aplikację WinForms (EXE) rozesłaną do setek klientów... Którzy korzystają z jednej i tej samej bazy.
Nadal uważasz, że lepiej to zrobić w programie?
Po coś to zostało wymyślone...
Paweł Wenerski

Paweł Wenerski Oracle Fusion
Middleware
Consultant | Java
Full Stack Des...

Temat: Check constraint w MySQL?

Możesz ewentualnie wykorzystać typ Enum w definicji kolumny

http://dev.mysql.com/doc/refman/5.6/en/enum.html

Przykład:

CREATE TABLE sizes (
name ENUM('small', 'medium', 'large')
);
Tomasz Zadora

Tomasz Zadora programuję

Temat: Check constraint w MySQL?

Marcin Miga:
[...]

I co z tego? To, że exe będzie trochę większe? To nie jest 1995 rok gdzie programy przenosiło się na dyskietkach.

Tak, nadal uważam, że logikę najlepiej trzymać jak najdalej od bazy/warstwy danych, po za wyjątkowymi sytuacjami.
Łukasz P.

Łukasz P. Student, Akademia
Ekonomiczna im.
Oskara Langego we
Wrocł...

Temat: Check constraint w MySQL?

Michał Bukarowicz:
to ja może się podłącze do dyskusji. Mam podobny problem. Stworzyłem tabele filmy i dodałem warunek, że kolumna data_produkcji nie może być starsza niż 1980-01-01, taki kod , alter table filmy add constraint data_produkcji_spr check (gatunek_produkcji >='1980-01-01'); a gdy dodawałem dane wpisałem data produkcji poniżej 1980 i baza mi zaakceptowała. Gdzie jest błąd ?

Generalnie check nie działa w MySQL tak jak np. w Oraclu także takie coś nie pójdzie raczej, to co chcesz osiągnąć można zrobić wyzwalaczem before insert i before update, ja u siebie tak robię i działa.

Tomek dlaczego logiki nie ma co pchać do bazy (po za obsługą błędów)? Ostatnio popisałem dużo wyzwalaczy, które "wymuszają" pewien ład. Skoro są klucze obce, reguły integralności, transakcje to dlaczego zostawać przy MyISAM?
Tomasz Zadora

Tomasz Zadora programuję

Temat: Check constraint w MySQL?

MyISAM nadal świetnie się sprawdza w sytuacji kiedy zdecydowana większość zapytań to odczyty, jest mało zapisów, szczególnie jednoczesnych.

Wymuszenie ładu po stronie bazy czy po stronie aplikacji to też pewien wybór w pewnych sytuacjach lepszy w innych gorszy. Natomiast MySQL jest pod tym względem tak ubogi i niedoskonały w porównaniu do innych popularnych baz (np. PostgreSQL), że nie ma specjalnie sensu bawić się w triggery i procedury.

Jedna z najbardziej wykurzających rzeczy (przynajmniej w 5.5):
Currently, cascaded foreign key actions do not activate triggers.
z http://dev.mysql.com/doc/refman/5.5/en/create-trigger....

Jaki jest sens w takim razie używania tego po za prostymi jeżeli chodzi o logikę bazami? Wg. ma to sens głównie wtedy kiedy korzyść na wydajności osiągnięta z wykonywania operacji w procedurach po stronie bazy jest znaczący w stosunku do wykonywania tego po stronie aplikacji.

Jak ktoś chce skomplikowaną logikę robić po stronie db to jest PostgreSQL, Oracle, Firebird, i inne silniki.

Inne powody przeniesienia logiki z bazy do aplikacji wyjaśniłem już wyżej.

konto usunięte

Temat: Check constraint w MySQL?

Tomasz Zadora:
Jak ktoś chce skomplikowaną logikę robić po stronie db to jest PostgreSQL, Oracle, Firebird, i inne silniki.

dobra co ma takiego fajnego Firebird czego nie ma MySQL?
Tomasz Zadora

Tomasz Zadora programuję

Temat: Check constraint w MySQL?

Poczytaj sobie dokumentacje i porównaj to się dowiesz :)

konto usunięte

Temat: Check constraint w MySQL?

Tomasz Zadora:
Poczytaj sobie dokumentacje i porównaj to się dowiesz :)


nie pytam dokumentacji tylko Ciebie
Tomasz Zadora

Tomasz Zadora programuję

Temat: Check constraint w MySQL?

Co to jakiś egzamin? LOL, sorry ale nie mam czasu na takie pierdoły a już szczególnie z jednym z naczelnych trolli. Skończy się na 20-stu wypowiedziach i nalewaniu z pustego w próżne, najważniejsze rzeczy dotyczące MySQLa już napisałem.

konto usunięte

Temat: Check constraint w MySQL?

Tomasz Zadora:
Co to jakiś egzamin? LOL,

nie prośba o uzasadnienie
sorry ale nie mam czasu na takie pierdoły a już szczególnie z jednym z naczelnych trolli.

argumenty ad persona to jest dopiero Trolowanie buahahaha, poziomo Onetu
Skończy się na 20-stu wypowiedziach i nalewaniu z pustego w próżne, najważniejsze rzeczy dotyczące MySQLa już napisałem.

nie tylko na jednej sensownej

no to jak? Wyjawisz sekret wyższości Firebird nad MySQl-em? bo wszystkich zżera tu ciekawość
Tomasz Zadora

Tomasz Zadora programuję

Temat: Check constraint w MySQL?

Wszystkich zżera ciekawość? :D Masz jakieś rozdwojenie jaźni? Pisz za siebie człowieku - właśnie to miałem na myśli wspominając o trollowaniu, czym już popisałeś się dziesiątki razy na goldenline.

Główna różnica jest taka, że w Firebirdzie nie ma tych ograniczeń w systemie triggerów/procedur które są w MySQLu, nie było już ich nawet w starym Interbasie który leży u podstaw Firebirda, teraz wejdź sobie na:

http://dev.mysql.com/doc/refman/5.5/en/stored-program-...

i przeczytaj jakie to są ograniczenia i już będziesz wiedział, największą bolączką jest "Triggers currently are not activated by foreign key actions."

Jednak przecież Tobie nie o to chodzi, żeby się tego dowiedzieć, prawda? Koniec dyskusji (z Tobą).

konto usunięte

Temat: Check constraint w MySQL?

Tomasz Zadora:
Wszystkich zżera ciekawość? :D Masz jakieś rozdwojenie jaźni? Pisz za siebie człowieku - właśnie to miałem na myśli wspominając o trollowaniu, czym już popisałeś się dziesiątki razy na goldenline.

masz jakiś uraz że ciągle o tym piszesz?
Główna różnica jest taka, że w Firebirdzie nie ma tych ograniczeń w systemie triggerów/procedur które są w MySQLu, nie było już ich nawet w starym Interbasie który leży u podstaw Firebirda, teraz wejdź sobie na:

http://dev.mysql.com/doc/refman/5.5/en/stored-program-...

i przeczytaj jakie to są ograniczenia i już będziesz wiedział, największą bolączką jest "Triggers currently are not activated by foreign key actions."

bardzo sensowna odpowiedź
Jednak przecież Tobie nie o to chodzi, żeby się tego dowiedzieć, prawda? Koniec dyskusji (z Tobą).

akurat konkretnie chciałem się dowiedzieć o to o co pytałem, dyskusji o dupie maryni nie będzie
Łukasz P.

Łukasz P. Student, Akademia
Ekonomiczna im.
Oskara Langego we
Wrocł...

Temat: Check constraint w MySQL?

Witam, nie podoba mi się, że wątek zaczął zmierzać w kierunku, który SZBD jest lepszy i dlaczego (taki temat gdzieś już chyba jest). Check constraint w MySQL jest ułomny to wiedzą wszyscy ale da się to trochę obejść (ja stosuje pomysł z wyzwalaczem BEFORE i warunkiem IF który w razie nie spełnienia warunku "próbuje" duplikować primary key i wywala w ten sposób błąd, wada jest taka, że za każdym razem dostaje błąd z primary key bo inaczej nie potrafię wymusić błędu ze stosownym komunikatem, wiem że to "jakoś" da się zrobić, ktoś może zna ten sposób, testował? (nie pisać że takie coś to nie w MySQL)

Następna dyskusja:

Szkolenie MySQL - ktos sie ...




Wyślij zaproszenie do