problem z NOT NULL

Odpowiedz Nowy wątek
2011-10-17 23:45
0

Mam utworzoną tabelę:

CREATE TABLE test
(
id int UNIQUE,
nazwa varchar(55) NOT NULL,
rok date,
miasto varchar(55),
liczba int DEFAULT 100
)

Dlaczego gdy próbuje dodać:

INSERT INTO test(id, rok, miasto, liczba)
VALUES(1, '1995-01-01', 'Bielsko-Biala', 200)

to ten rekord zostaje dodany mimo że nie podaję nic do pola nazwa które ma ustawione NOT NULL?

edytowany 2x, ostatnio: madmike, 2011-10-18 00:57

Pozostało 580 znaków

2011-10-17 23:49
1

Właśnie dlatego, że nic nie dodajesz, to "ląduje" tam NULL, które nie ma prawa tam "wylądować". Musisz albo coś tam wstawiać (NOT NULL) albo ustawić np. DEFAULT ""

Edit: albo tłumacz sobie zapis nazwa VARCHAR(55) NOT NULL - nazwa nie może przyjąć wartości pustej - NULL, musi przyjąć określoną wartość, musi zostać podana...


edytowany 2x, ostatnio: madmike, 2011-10-17 23:59

Pozostało 580 znaków

2011-10-18 00:18
0

trochę nie rozumiem, to skoro nie nie podaje do tego pola gdzie jest NOT NULL to nie powinienem dostawać jakiegoś błędu?

Pozostało 580 znaków

2011-10-18 00:18
ŁF
0
lofi napisał(a)

Dlaczego gdy próbuje dodać:

INSERT INTO test(id, rok, miasto, liczba)
VALUES(1, '1995-01-01', 'Bielsko-Biala', 200)

to ten rekord zostaje dodany mimo że nie podaję nic do pola nazwa które ma ustawione NOT NULL?

not null gwarantuje, że pole nie będzie mieć takiej wartości. skoro taka wartość się dodaje i nie leci błąd, to albo pole nie ma not null, albo ma default, albo istnieje trigger lub inny mechanizm, który ustawia polu niepustą wartość. nie ma innej opcji. coś zrobiłeś źle, albo czegoś nie zauważyłeś.

i jeszcze jedno: która baza danych???


edytowany 3x, ostatnio: ŁF, 2011-10-18 00:20

Pozostało 580 znaków

2011-10-18 00:40
0

Ciekawe, MySQL 5.5 pozwolił na takie zapytanie...
firebird wyrzucił validation error for column NAZWA, value "*** null ***"
SQLite wyrzucił test.nazwa may not be NULL...

Po co w MySQL jest NOT NULL??? :/


edytowany 1x, ostatnio: madmike, 2011-10-18 00:49

Pozostało 580 znaków

2011-10-18 00:56
0
ŁF napisał(a)

która baza danych???

MySQL 5.1.34-community, w tym polu nie ma wartości domyślnej, sprawdzałem jeszcze zawartość programem HeidiSQL i rzeczywiście rekord został dodany z pustym polem na które ustawiłem NOT NULL.

edytowany 1x, ostatnio: lofi, 2011-10-18 00:59

Pozostało 580 znaków

2011-10-18 01:08
0

Znalezione na jakimś forum:

If your "not null" field is a text type (TEXT, VARCHAR, ..) then it's not null, but empty. So MySQL doesn't complain, because it cannot distinguish between empty and null.

If you define an integer (or any other number type) field "not null", then MySQL would complain, if you leave it without any value. (If set a default value for your "not null" field, then MySQL wouldn't complain either.)

wolne tłumaczenie:

Jeśli pole oznaczone jako NOT NULL jest polem typu tekstowego (TEXT, VARCHAR) MySQL nie rzuca się, bo nie potrafi rozróżnić pustego łańcucha i NULL - dla niego to jest to samo.

Jeśli pole oznaczone jako NOTT NULL jest polem liczbowym, MySQL będzie się rzucać, bo nie wstawiasz żadnej wartości - tutaj dla niego istnieje różnica pomiędzy pustą wartością a liczbą


edytowany 1x, ostatnio: madmike, 2011-10-18 01:09

Pozostało 580 znaków

2011-10-18 10:04
0

czy ktoś ma jeszcze jakiekolwiek złudzenie, że mysql powinien być nazywany RDBMS???
:D :D :D :D :D :D


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
Lepszy skrót to ADBMS (A - alternative)... No ale żeby SQLite było bardziej poprawne to już jakaś masakra... - vpiotr 2011-10-18 10:13
Przecież to jest patologia jakaś... Dlaczego baza zapisuje sobie inne wartości niż te, które każę jej zapisać? :| - somekind 2011-10-18 12:40
Któraś Wyrocznia robiła tak samo - Null = '' - Marcin.Miga 2011-10-18 15:58

Pozostało 580 znaków

2011-10-18 13:57
ŁF
0
madmike napisał(a)

Jeśli pole oznaczone jako NOT NULL jest polem typu tekstowego (TEXT, VARCHAR) MySQL nie rzuca się, bo nie potrafi rozróżnić pustego łańcucha i NULL - dla niego to jest to samo.
o ku*wa! oO
i ja kiedyś tego shitu używałem...


Pozostało 580 znaków

2011-10-19 13:29
0

Wyobraźcie sobie koledzy, że w języku JAVA porównam napisy za pomocą operatora '==', a następnie po zauważeniu, że to nie działa, zacznę najeżdżać na sam język, jego użytkowników i twórców.

Wy dokładnie to robicie tylko, że w stosunku do MySQL. Wypadałoby najpierw przekonać się jak coś działa albo zajrzeć do dokumentacji, żeby w ogóle zabierać głos...

Teraz trochę przykładów:
mysql> CREATE TABLE tab (id INT NOT NULL, name VARCHAR(40) NOT NULL);
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO tab (id, name) VALUES (1, NULL);
ERROR 1048 (23000): Column 'name' cannot be null

mysql> INSERT INTO tab (id, name) VALUES (NULL, 'napis');
ERROR 1048 (23000): Column 'id' cannot be null

mysql> INSERT INTO tab (name) VALUES ('napis');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> INSERT INTO tab(id) VALUES (1);
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> SELECT * FROM tab;

id name
0 napis
1

2 rows in set (0.00 sec)

Pozostało 580 znaków

2011-10-19 13:42
3

i co z tego wynika?? Jedynie tyle, że mysql robi coś po swojemu i inaczej niż wszystkie znane mi SZBD. W Oracle, FB, MSSQL (te mogłem sprawdzić teraz) ŻADEN rekord nie jest dodawany! Tylko mysql jak zawsze PO SWOJEMU. Każda normalna baza traktuje wartość nieobecną w insercie jako NULL a nie "huj wi co"


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
edytowany 1x, ostatnio: Misiekd, 2011-10-19 13:43

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0