Andmebaasis kasutatakse erinevaid võtmeid (keys), et tagada andmete unikaalsus, seoste loomine tabelite vahel ja andmete terviklikkus.
Primary Key (Primaarvõti)
Selgitus:
Primaarvõti on tulp (või tulbad), mis unikaalselt tuvastab iga rea tabelis.
Tabelis saab olla ainult üks primaarvõti ja selle väärtus ei tohi olla tühi (NULL).
Näide:

„StudentID“ on primaarvõti, sest iga väärtus on kordumatu.

Erinevus:
- Unikaalne ja ei tohi olla NULL.
- Tabelis võib olla ainult üks.
- Sarnaneb Unique Key-ga, kuid primaarvõti ei tohi olla tühi, ja tabelis saab olla ainult üks primaarvõti.
Foreign Key (Võõrvõti)
Selgitus:
Võõrvõti on veerg, mis viitab teise tabeli primaarvõtmele, luues seose kahe tabeli vahel.
See tagab, et viidatud andmed eksisteerivad ka teises tabelis.
Näide:
Tabel: Departments

Tabel: Employees

„DepartmentID“ tabelis Employees on võõrvõti, mis viitab Departments-tabeli DepartmentID-le.
Erinevus:
- Loob seose kahe tabeli vahel.
- Viitab teise tabeli primaarvõtmele või unique key-le.
- Sarnaneb Primary Key-ga ainult unikaalsuse osas, kuid ei pruugi olla unikaalne oma tabelis ja võib sisaldada NULL-e.
Unique Key (Unikaalvõti)
Selgitus:
Unikaalvõti tagab, et kõik väärtused veerus on erinevad, kuid erinevalt primaarvõtmest võib unikaalvõtmes olla ka NULL-väärtusi.
Ühes tabelis võib olla mitu unikaalvõtit.
Näide:

„Email“ on unikaalvõti — ei tohi korduda, kuid võib olla NULL.

Erinevus:
- Tagab unikaalsuse, kuid võib sisaldada NULL-väärtusi.
- Tabelis võib olla mitu unikaalvõtit.
- Sarnaneb Primary Key-ga, kuid Primary Key ei tohi olla NULL ja tabelis võib olla ainult üks.
Simple Key (Lihtvõti)
Selgitus:
Lihtvõti koosneb ainult ühest veerust, mis unikaalselt määrab rea.
Kõik primaarvõtmed, mis põhinevad ainult ühel väljal, on lihtvõtmed.
Näide :

„ProductID“ on lihtvõti.
Erinevus:
- Koosneb ainult ühest veerust.
- Võib olla Primary Key või Unique Key.
- Erineb Composite Key-st, mis koosneb mitmest veerust.
Composite Key (Koosvõti)
Selgitus:
Koosvõti koosneb mitmest veerust, mida koos kasutatakse rea unikaalseks tuvastamiseks.
Üksi võetud veerud ei ole unikaalsed, aga koos moodustavad unikaalse võtme.
Näide :

„StudentID“ ja „CourseID“ koos moodustavad koosvõtme, mis tagab iga kirje unikaalsuse tabelis Enrollments..
Erinevus:
- Koosneb kahest või enamast veerust.
- Ainult kombinatsioon on unikaalne(üksik veerg ei pruugi olla).
- Sarnaneb Compound Key-ga, kuid Composite Key on primaarne ainult selles tabelis, samas kui Compound Key kasutatakse ka teises tabelis võõrvõtmena.
Compound Key (Liitvõti)
Selgitus:
Liitvõti on kombinatsioon kahest või enamast veerust, mida kasutatakse ka võõrvõtmena teises tabelis.
See sarnaneb composite key’ga, kuid seda kasutatakse seoste loomisel.
Näide :
Tabel : Orders
„OrderID“ ja „ProductID“ koos moodustavad liitvõtme, mida kasutatakse võõrvõtmena tabelis OrderDetails.

„OrderID + ProductID“ on liitvõti, mida saab kasutada võõrvõtmena näiteks hinnete tabelis.
Erinevus:
- Mitme veeru kombinatsioon, mis samal ajal on primaarvõti ja võib olla võõrvõti teises tabelis.
- Sarnaneb Composite Key-ga, kuid Compound Key rõhutab ka seost teise tabeliga.
Superkey (Supervõti)
Selgitus:
Supervõti on üks või mitu veergu, mis suudab rea unikaalselt tuvastada, kuid see võib sisaldada ka lisaveerge, mida pole vaja.
Kõik primaarvõtmed on supervõtmed, kuid mitte kõik supervõtmed pole primaarsed.
Näide :

„StudentID + Name“ on supervõti, kuigi ainult StudentID juba tagab unikaalsuse.
Erinevus:
- Võib sisaldada rohkem veerge kui vaja, et unikaalsust tagada.
- Kõik Primary Key-d on supervõtmed, kuid mitte kõik supervõtmed ei ole primaarvõtmed.
- Sarnaneb Candidate Key-ga, kuid Candidate Key ei sisalda üleliigseid veerge.
Candidate Key (Kandidaatvõti)
Selgitus:
Kandidaatvõti on potentsiaalne primaarvõti – st. iga kandidaatvõti võiks olla valitud primaarvõtmeks.
Primaarvõti valitakse nende seast.
Näide :

„ID“ ja „Email“ on mõlemad kandidaadid primaarvõtmeks.
Erinevus:
- Kõik kandidaadid võivad olla primaarvõtmed.
- Ainult üks valitakse tegelikuks Primary Key-ks, ülejäänud võivad olla Alternate Key-d.
- Sarnaneb Superkey-ga, kuid ei sisalda liigseid veerge.
Alternate Key (Alternatiivvõti)
Selgitus:
Alternatiivvõti on kandidaatvõti, mida ei valitud primaarvõtmeks.
See on nagu varuprimaarvõti.
Näide :

Kui „ID“ on primaarvõti, siis „Email“ on alternatiivvõti.

Erinevus:
- See on Candidate Key, mida ei valitud Primary Key-ks.
- Tagab unikaalsuse, aga ei ole primaarne.
- Sarnaneb Unique Key-ga, kuid pärineb kandidaatvõtmete seast.
Kasutatud allikad
- W3Schools – Database Keys Explained
- GeeksforGeeks – Types of Keys in DBMS
- Tunnimaterjalid ja õpetaja slaidid
Terve kood kõige võtmega
CREATE DATABASE VõtidLukk;
USE VõtidLukk;
-- -------------------------
-- Primary Key (Primaarvõti)
-- -------------------------
CREATE TABLE Students (
StudentID INT PRIMARY KEY, -- Primaarvõti
Name VARCHAR(50),
Age INT
);
INSERT INTO Students VALUES (1, 'Anna', 20);
INSERT INTO Students VALUES (2, 'Mark', 21);
SELECT * FROM Students;
-- Viga
INSERT INTO Students VALUES (1, 'Maarika', 20);
-- -------------------------
-- Primary Key (Primaarvõti)
-- -------------------------
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY, -- Primaarvõti
DepartmentName VARCHAR(50)
);
INSERT INTO Departments VALUES (1, 'IT'), (2, 'HR');
SELECT * FROM Departments;
-- -------------------------
-- Foreign Key (Võõrvõti)
-- -------------------------
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY, -- Primaarvõti
Name VARCHAR(50),
DepartmentID INT,
FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID) -- Võõrvõti
);
INSERT INTO Employees VALUES (1, 'Alice', 1);
SELECT * FROM Employees;
-- -------------------------
-- Unique Key (Unikaalvõti)
-- -------------------------
CREATE TABLE Users (
UserID INT PRIMARY KEY, -- Primaarvõti
Email VARCHAR(100) UNIQUE, -- Unikaalvõti
Phone VARCHAR(20)
);
INSERT INTO Users VALUES (1, 'anna@mail.com', '555-111');
INSERT INTO Users VALUES (2, 'mark@mail.com', '555-222');
SELECT * FROM Users;
-- Viga
INSERT INTO Users VALUES (3, 'anna@mail.com', '444-123');
-- -------------------------
-- Simple Key (Lihtvõti)
-- -------------------------
CREATE TABLE Products (
ProductID INT PRIMARY KEY, -- Lihtvõti / Primaarvõti
ProductName VARCHAR(50)
);
INSERT INTO Products VALUES (1, 'Book'), (2, 'Pen');
SELECT * FROM Products;
-- -------------------------
-- Composite Key (Koosvõti)
-- -------------------------
CREATE TABLE Enrollments (
StudentID INT,
CourseID INT,
Grade CHAR(1),
PRIMARY KEY (StudentID, CourseID) -- Koosvõti / Composite Key
);
INSERT INTO Enrollments VALUES (1, 10, 'A');
INSERT INTO Enrollments VALUES (1, 11, 'B');
SELECT * FROM Enrollments;
-- -------------------------
-- Compound Key (Liitvõti)
-- -------------------------
CREATE TABLE Orders (
OrderID INT,
ProductID INT,
Quantity INT,
PRIMARY KEY (OrderID, ProductID) -- Liitvõti
);
CREATE TABLE OrderDetails (
OrderID INT,
ProductID INT,
FOREIGN KEY (OrderID, ProductID) REFERENCES Orders(OrderID, ProductID) -- Võõrvõti (kasutab liitvõtit)
);
INSERT INTO Orders VALUES (1, 100, 2);
INSERT INTO OrderDetails VALUES (1, 100);
SELECT * FROM Orders;
SELECT * FROM OrderDetails;
-- -------------------------
-- Superkey (Supervõti)
-- -------------------------
CREATE TABLE StudentsSuper (
StudentID INT PRIMARY KEY, -- Primaarvõti (Superkey näide)
Name VARCHAR(50),
Email VARCHAR(100)
);
INSERT INTO StudentsSuper VALUES (1, 'Anna', 'anna@mail.com');
INSERT INTO StudentsSuper VALUES (2, 'Mark', 'mark@mail.com');
SELECT * FROM StudentsSuper;
-- -------------------------
-- Candidate Key (Kandidaatvõti)
-- -------------------------
CREATE TABLE Customers (
CustomerID INT,
Email VARCHAR(100),
Phone VARCHAR(20),
CONSTRAINT UQ_Customers_Email UNIQUE (Email), -- Kandidaatvõti
CONSTRAINT UQ_Customers_Phone UNIQUE (Phone) -- Kandidaatvõti
);
SELECT * FROM Customers;
-- -------------------------
-- Alternate Key (Alternatiivvõti)
-- -------------------------
CREATE TABLE Accounts (
AccountID INT PRIMARY KEY, -- Primaarvõti
Email VARCHAR(100) UNIQUE -- Alternatiivvõti
);
INSERT INTO Accounts VALUES (1, 'anna@mail.com');
INSERT INTO Accounts VALUES (2, 'mark@mail.com');
SELECT * FROM Accounts;
-- Viga
INSERT INTO Accounts VALUES (3, 'anna@mail.com');