Jedan članak za potpuno razumevanje podešavanja atributa pri definisanju MySQL kolona
Prilikom kreiranja tabele potrebno je definisati kolone tabele, i svaka kolona ima izvesne atribute — na primer da li ima podrazumevanu vrednost, da li sme da bude NULL, da li je primarni ključ itd.
Ovi atributi koji ograničavaju kolone čine da vrednosti kolona bolje odgovaraju našim očekivanjima, a takođe će olakšati kasnije pretraživanje i ažuriranje podataka.
Na primer, ako prilikom definisanja kolone dodamo podrazumevanu vrednost, onda prilikom umetanja podataka, ukoliko ne navedemo vrednost te kolone (na primer u Java programu), baza će automatski popuniti podrazumevanu vrednost za nas.
Kao u tabeli sa detaljima članaka u projektu Jishupai, za kolonu id podesili smo atribute NOT NULL, AUTO_INCREMENT, COMMENT itd.

Hajde da zajedno pogledamo koje su to uobičajeni atributi MySQL kolona.
Podrazumevana vrednost
Podrazumevana vrednost (DEFAULT) znači da prilikom umetanja podataka, ako vrednost kolone nije navedena, koristiće se podrazumevana vrednost.
Kreirajmo ovakvu tabelu, koja sadrži tipove kolona poput varchar, int, datetime, i svaka kolona ima podešenu podrazumevanu vrednost.
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT 'Chenmo Wang Er',
`age` int(11) DEFAULT 18,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;Prilikom umetanja podataka, ako ne navedemo vrednosti kolona name, age, create_time, koristiće se podrazumevane vrednosti.
INSERT INTO `user` (`id`) VALUES (1);Vidimo da prilikom umetanja podataka navodimo samo vrednost kolone id, dok su ostale kolone izostavljene, ali nam je MySQL automatski popunio podrazumevane vrednosti.

DEFAULT 'Chenmo Wang Er': navodi podrazumevanu vrednost kolone name kao „Chenmo Wang Er".DEFAULT 18: navodi podrazumevanu vrednost kolone age kao 18.DEFAULT CURRENT_TIMESTAMP: navodi podrazumevanu vrednost kolone create_time kao trenutno vreme.
A šta ako ne navedemo podrazumevanu vrednost, a opet ne umetnemo podatak — koja će vrednost te kolone biti?
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255),
`age` int(11),
`create_time` datetime,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;Prilikom umetanja podataka nismo naveli vrednosti za kolone name, age, create_time, niti smo podesili podrazumevane vrednosti.
INSERT INTO `user` (`id`) VALUES (1);Vidimo da nam je u ovom slučaju MySQL popunio vrednost NULL.

Upravo zato Alibabina razvojna pravila zahtevaju da u POJO-ima koristimo ugrađene (wrapper) tipove, a ne proste tipove podataka, jer rezultat upita nad bazom može biti null — ako bismo koristili proste tipove podataka, usled automatskog raspakivanja dobio bi se NPE (NullPointerException).
Naravno, DEFAULT ne treba koristiti nepromišljeno; podrazumevanu vrednost treba podesiti prema poslovnim potrebama. Na primer, prilikom kreiranja tabele korisnika ne bismo smeli da podesimo podrazumevanu vrednost za kolonu name, jer bi u tom slučaju, kada korisnik ne unese ime, MySQL po podrazumevanoj vrednosti popunio „Chenmo Wang Er" — što je očigledno nelogično.
Trebalo bi što pre podsetiti korisnika da unese ime, umesto da ga popunjavamo podrazumevanom vrednošću.
Ali za kolonu create_time možemo podesiti podrazumevanu vrednost na CURRENT_TIMESTAMP — tada će nam MySQL automatski popuniti trenutno vreme, pa Java program ne mora prilikom umetanja podataka ručno da popunjava vreme.
Da li sme da bude NULL
Ponekad želimo da vrednost izvesnih kolona ne sme da bude NULL — na primer korisničko ime, broj mobilnog telefona, imejl i slično; vrednosti ovih kolona su obavezne.
...
