Vastus (27.08.2024 14:48): Ei ole!
Tühi string on väärtus (kuigi väga lühike).
NULL on tähis, et väärtust ei ole.
NOT NULL veergu saab seega tühja stringi panna, sest see täidab tingimuse, et väljas peab väärtus olema.
Kui näiteks soovida keelata veerus perenimi tühjad stringid, siis tuleb lisada CHECK kitsendus
CHECK(perenimi<>'')
MS Accessi graafilise kasutajaliidese kaudu määratav
Allow Zero Length = No on selle alternatiiv.
Tühja stringi ja NULLi võib kasutada selleks, et registreerida erinevad põhjused, miks väärtus puudub. Näiteks kui vastaval olemil ei ole sellist atribuuti (näiteks organisatsiooni perenimi), siis kasutatakse tühja stringi aga kui olemil on atribuut, aga selle väärtus pole teada, siis kasutatakse NULLi. Samas leian, et tühjade stringide lubamine tekitab asjatut segadust. Tabelid tuleks kavandada nii, et kui olemil ei ole mingit atribuuti, siis vastavas tabelis pole ka sellist veergu.
CREATE TABLE Isik(isik_id INTEGER PRIMARY KEY,
perenimi VARCHAR(50));
INSERT INTO Isik (isik_id, perenimi) VALUES (1, '');
INSERT INTO Isik (isik_id, perenimi) VALUES (2, NULL);
Ülesanne: Leia isikud, kelle perenimi puudub.
SELECT * FROM Isik WHERE perenimi='';
--tulemuses üks rida
SELECT * FROM Isik WHERE perenimi IS NULL;
--tulemuses üks rida
Seega parem on nii - kui nime ei ole, siis NULL, kui on, siis midagi muud kui tühi string.
Siin on võimalik neid lauseid viie andmebaasisüsteemi põhjal testida.
NB! Andmebaasisüsteem Oracle käitub SQL standardis ettenähtust ning teistest andmebaasisüsteemidest erinevalt. Nimelt teeb Oracle automaatse asenduse ''=>NULL. Seega korrates eelnevaid lauseid Oracles (testitud nii 12c Enterprise Edition kui 23ai Free) on tulemus:
SELECT * FROM Isik WHERE perenimi='';
--tulemuses
null rida
SELECT * FROM Isik WHERE perenimi IS NULL;
--tulemuses
kaks rida
Kui Oracles käivitada järgnev kood, siis rea lisamisel tekib NOT NULL kitsenduse viga.
CREATE TABLE Isik(isik_id NUMBER(10) PRIMARY KEY,
perenimi VARCHAR2(50) NOT NULL);
INSERT INTO Isik (isik_id, perenimi) VALUES (1, '');
Tulemus: SQL Error: ORA-01400: cannot insert NULL into ("SYSTEM"."ISIK"."PERENIMI")