câmp Null în MySQL

intrare

De multe ori pe forumuri și chiar în manuale scrie că este mai bine să nu utilizați câmpul de NULL în MySQL. Aceste declarații sunt derutați de faptul că nimeni nu deranjează să explice de ce NULL - este rău. Acest articol este destinat pentru a afla ce este NULL în MySQL și nu atât diavolul teribil ca el este pictat.

Ce este NULL?

Un exemplu. Site-uri Tabelul conține un NULL UNSIGNED câmp PR INT. PR - valoare întreagă care poate fi zero. Care este valoarea pentru a insera atunci când PR nu este calculat și, prin urmare, este necunoscut? NULL.

Cât de periculos este NULL?

Comparația NULL cu orice altă valoare, chiar și cu un asociat (în cele mai multe limbaje de programare, în special în PHP nul, 0, una falsă și la fel, în cazul în care nu este utilizat comparație strictă care implică compararea tip) returnează NULL FALSE. Din prima capcană.
Să presupunem că avem un tabel:

Adăugați 2 înregistrări în ea:

INSERT INTO utilizatori (nume, familie) VALORI ( 'Andrew' 'Romanov'), ( 'Ivan', NULL);

Dacă doriți să combinați numele și prenumele, a primit un câmp de nume, de exemplu, o astfel de cerere:

CONCAT SELECT (numele, '', de familie) din `users`

MySQL nu se ridică la nivelul așteptărilor dumneavoastră. Vei primi un NULL în loc de Ivan.

Bit neașteptat. nu-i așa?
De fapt, nu este nimic surprinzător dacă vă amintiți, că orice operațiune cu o NULL NULL de retur, cu excepția operațiunilor speciale concepute pentru a lucra cu NULL: IS NULL, nu este nulă, IFNULL ()

Sortează după NULL

Vreau doar să respingă unele expresii din manualul MySQL românesc, care, atunci când sortarea prin coloane care conțin valori NULL, NULL znachiniya acestea cele mai multe ori se transformă în partea de sus. Acest lucru nu este așa.

SELECT nume, de familie din `COMANDA DE users` ASC familie

câmp Null în MySQL

SELECT nume, de familie din `COMANDA users` DE DESC de familie

câmp Null în MySQL

După cum puteți vedea, NULL este considerată a fi cea mai mică valoare, iar ordinea de sortare îl afectează.

Grupurile și NULL

Este simplu.
MySQL grupate în funcție de NULL precum și pe orice alt domeniu.

Adăugăm noastră coloana utilizatori tabela de marcaj INT NULL UNSIGNED;

câmp Null în MySQL

Calculăm câți utilizatori au o anumită sumă de puncte, adică, grup de selecție a punctajului câmp
SELECT COUNT (*), scor din `GROUP users` prin scorul

După cum se poate observa, MySQL grupat rândul 2 cu scor = NULL

Indexează și NULL

Undeva se rătăcește că MySQL utilizează indicii în cazul în care coloana poate accepta valori NULL.
Nu este asa!

Ne petrecem câteva experimente.

Selectați toate înregistrările în care scorul = NULL. Nu uitați că trebuie să facem pentru a folosi IS NULL de construcție
EXPLICAȚI SELECT * FROM `users` cazul în care scorul este nul

Selectați toate înregistrările în cazul în care numărul de puncte mai mult, de exemplu, cinci.
EXPLICAȚI SELECT * FROM `users` WHERE` score`> 5

Am găsit utilizatorul care exact 7 puncte
EXPLICAȚI SELECT * FROM `users` WHERE` score` = 7

Putem concluziona că realitatea este înșelătoare și acolo.
Este sigur de a utiliza NULL-câmp pentru a crea index, iar indicele va funcționa.

Ar trebui să menționăm, de asemenea, index unic tip.
Am considerat mai sus că grupurile MySQL NULL atât valoarea normală și toate rândurile cu scor = NULL au fost grupate într-un singur tuplu. Din aceasta poate urma o concluzie falsă, care nu reușesc să utilizeze index unic, împreună cu un câmp NULL. Cu toate acestea, nu este. Pentru NULL index unic este o valoare destul de unic, si MySQL fara obstacole va permite să inserați mai multe rânduri cu valori NULL ale câmpului care reprezintă index unic.

Când se utilizează NULL?

Mai devreme am dat exemplul din tabelul site-uri care conține un câmp de PR.
PR - este valoarea întreagă care poate fi setat la 0, în plus, ar putea fi în măsură să „nu numărate“. Cum să pună în aplicare stocarea acestor proprietăți în tabel?

Cei care se tem să folosească un NULL, și de a crea pr ca INT UNSIGNED NOT NULL DEFAULT 0; forțat să adăugați un alt câmp la masă, de exemplu, pr_calculated TINYINT (1) DEFAULT 0. Conform acestuia, ei verifică dacă PR este luată în calcul sau nu. Prin urmare, dacă PR = 0 și pr_calculated = 0. înseamnă că PR nu este de fapt egal cu zero, și doar nu numărate. Există prea multe condiții?

De ce să renunțe la această limbă vă oferă „din cutie“?
Valoarea NULL pentru acest câmp este ideal. NULL - înseamnă „nici o valoare“, adică, nu este luată în calcul. Dacă valoarea este zero, atunci într-adevăr este zero. Este simplu.

Un al doilea exemplu de caz adecvat pentru utilizarea NULL - acest câmp descendent.

Câmpul indică un descendent-id înregistrări de la un alt (sau același tabel). Un exemplu de un astfel de câmp poate fi PARENT_ID.

Cei care se tem să folosească un NULL, creați o coloană INT PARENT_ID UNSIGNED DEFAULT NOT NULL 0. Dacă PARENT_ID nicăieri indică - conține o valoare de zero. În acest caz, arhitectul presupune că masa nu va fi intrările cu id = 0. Valoarea de acord cu faptul că MySQL implicit începe cu unitatea de creștere, dar acest lucru nu înseamnă că tabela nu poate apărea înregistrarea id = 0. înregistrarea poate avea loc deoarece baza de date nu interzice.

Când vom crea un câmp PARENT_ID ca INT NULL UNSIGNED. atunci vom reduce probabilitatea ca linia, ca urmare a oricărei acțiuni va indica prin PARENT_ID pe linie într-adevăr existente la zero! În MySQL, nu puteți crea o înregistrare cu id = NULL. unde id este avtoinkrementalnym domeniu.

Nu există nici un motiv să se teamă de a crea un câmpuri NULL. Ar trebui să fie bine înțeles că NULL în MySQL nu este zero și nu fals - este lipsa de valori. Trebuie să știm cum funcționează MySQL cu NULL: nuanță acolo, dar nu prea mult. În MySQL nu există probleme cu câmpuri de indexare NULL.

programator de plumb Katin Sergey

Doriți să obțineți un audit SEO gratuit-site-ul?