Kas tühja stringi esinemise keelamine ja NOT NULL kitsendus on üks ja sama asi?

Postitas Erki Eessaar 03.03.2024 12:21 (muudeti 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")

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!