Administreerimise konspekt

Andmebaasi võtmete tüübid :

Võtmed on olulised komponendid, mis tagavad andmete terviklikkuse, unikaalsuse ja tõhusa juurdepääsu. Neid kasutatakse laialdaselt tabelis olevate tuplite (ridade) unikaalseks identifitseerimiseks.

Võtmeid kasutatakse ka suhete loomiseks relatsioonilise andmebaasi erinevate veergude ja tabelite vahel.


1. Primary Key (Primaarvõti)

Selgitus: Veerg või veergude kombinatsioon, mis unikaalselt identifitseerib iga tabeli rea.

  • Ei tohi sisaldada duplikaate.
  • Ei tohi olla NULL.
  • Tabelil võib olla ainult üks primaarvõti.

SQL näide koos veaga:

-- 1. PRIMARY KEY (Primaarvõti)
CREATE TABLE Students (
    StudentID INT PRIMARY KEY,
    Name VARCHAR(50),
    Age INT
);
INSERT INTO Students VALUES (1, 'Martin', 20);
INSERT INTO Students VALUES (2, 'Illia', 21);
select * from Students

-- VIGA: StudentID = 1 juba olemas
INSERT INTO Students VALUES (1, 'Mark Jurgen', 20);

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


2. Foreign Key (Võõrvõti)

Selgitus: Veerg, mis viitab teise tabeli primaarvõtmele.

  • Loob tabelite vahel seose.
  • Sarnaneb Primary Key-ga ainult unikaalsuse osas, kuid ei pruugi olla unikaalne oma tabelis ja võib sisaldada NULL-e.

SQL näide koos veaga:

-- 2. FOREIGN KEY (Võõrvõti)
CREATE TABLE Departments (
    DepartmentID INT PRIMARY KEY,
    DepartmentName VARCHAR(50)
);
INSERT INTO Departments VALUES (1, 'IT'), (2, 'LOGIT');

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Name VARCHAR(50),
    DepartmentID INT,
    FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID)
);

INSERT INTO Employees VALUES (1, 'Marek', 1);

-- VIGA: DepartmentID=99 ei eksisteeri tabelis Departments
INSERT INTO Employees VALUES (2, 'Nikitos', 99);

3. Unique Key (Unikaalvõti)

Selgitus: Tagab, et ühes veerus ei korduks ükski väärtus.

  • Erinevalt primaarvõtmest võib olla mitu unique-võtit.
  • Null väärtus on lubatud.

SQL näide koos veaga:

-- 3. UNIQUE KEY (Unikaalvõti)
CREATE TABLE Users (
    UserID INT PRIMARY KEY,
    Email VARCHAR(100) UNIQUE,  -- Unikaalvõti
    Phone VARCHAR(20)
);
INSERT INTO Users VALUES (1, 'martin@mail.com', '555-111');
INSERT INTO Users VALUES (2, 'mark@mail.com', '555-222');

-- VIGA: email juba olemas
INSERT INTO Users VALUES (3, 'martin@mail.com', '555-111');

4. Simple Key (Lihtvõti)

Selgitus: Üksik veerg, mis võib identifitseerida rea tabelis.

  • Kõige tavalisem võtme vorm.
  • Koosneb ainult ühest veerust.
  • Võib olla Primary Key või Unique Key.

SQL näide:

-- 4. Simple key ( Lihtvõti ) 
CREATE TABLE Products (
    ProductID INT PRIMARY KEY,  -- Lihtvõti / Primaarvõti
    ProductName VARCHAR(50)
);
INSERT INTO Products VALUES (1, 'PC'), (2, 'Playstation');
select * from Products

„ProductID“ on lihtvõti.


5. Composite Key (Koosvõti)

Selgitus: Mitme veeru kombinatsioon, mis koos tagab rea unikaalsuse.

Ainult kombinatsioon on unikaalne(üksik veerg ei pruugi olla).

SQL näide:

-- 5. COMPOSITE KEY (Koosvõti)
CREATE TABLE Kool (
    StudentID INT,
    CourseID INT,
    Grade CHAR(1),
    PRIMARY KEY (StudentID, CourseID)
);

INSERT INTO Kool VALUES (1, 2, 'A');
INSERT INTO Kool VALUES (1, 1, 'X');

„StudentID“ ja „CourseID“ koos moodustavad koosvõtme, mis tagab iga kirje unikaalsuse tabelis Kool.


6. Compound Key (Liitvõti)

Selgitus: Mitme erineva veeru kombinatsioon, mis identifitseerib rea tabelis.

  • Sageli kasutatakse koos välisvõtmetega.
  • Mitme veeru kombinatsioon, mis samal ajal on primaarvõti ja võib olla võõrvõti teises tabelis.

SQL näide:

-- Compound Key 

CREATE TABLE Studentss (
    StudentID INT,
    CourseID INT,
    Grade CHAR(1),
    PRIMARY KEY (StudentID, CourseID)  -- Liitvõti
);

CREATE TABLE StudentAssignments (
    StudentID INT,
    CourseID INT,
    AssignmentName VARCHAR(50),
    FOREIGN KEY (StudentID, CourseID) REFERENCES Studentss(StudentID, CourseID)
);

INSERT INTO Studentss VALUES (1, 201, 'A');
INSERT INTO Studentss VALUES (2, 202, 'B');
INSERT INTO Studentss VALUES (1, 202, 'C');

INSERT INTO StudentAssignments VALUES (1, 201, 'Homework 1');
INSERT INTO StudentAssignments VALUES (1, 202, 'Project 1');
INSERT INTO StudentAssignments VALUES (2, 202, 'Lab 1');

select * from Studentss
select * from StudentAssignments

„StudentID + CourseID“ on liitvõti (compound key) tabelis Studentss, mida saab kasutada võõrvõtmena (foreign key) tabelis StudentAssignments, et tagada, et igale hindele või ülesandele vastab olemasolev õpilase ja kursuse kombinatsioon.“


7. Superkey (Supervõti)

Selgitus: Kõik veerud või veergude kombinatsioonid, mis unikaalselt identifitseerivad tabeli rea.

  • Primaarvõti on üks supervõtme erivorm.
  • Võib sisaldada rohkem veerge kui vaja, et unikaalsust tagada.

SQL näide:

-- 7. SUPERKEY (Supervõti)
CREATE TABLE TTHKopilane (
    StudentID INT PRIMARY KEY,
    Name VARCHAR(50),
    Email VARCHAR(100) UNIQUE
);

INSERT INTO TTHKopilane VALUES (1, 'Nikita', 'nikita@mail.com');
INSERT INTO TTHKopilane VALUES (2, 'Nikitos', 'nikitos@mail.com');

select * from TTHKopilane

„StudentID + Name“ on supervõti, kuigi ainult StudentID juba tagab unikaalsuse.


8. Candidate Key (Kandidaatvõti)

Selgitus: Kõik veerud või veergude kombinatsioonid, mis võivad olla primaarvõtmed.

  • Kõik kandidaadid võivad olla primaarvõtmed.
  • Ainult üks valitakse tegelikuks Primary Key-ks, ülejäänud võivad olla Alternate Key-d.

SQL näide:

-- 8. CANDIDATE KEY (Kandidaatvõti)
CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    Email VARCHAR(100),
    Phone VARCHAR(20),
    CONSTRAINT UQ_Customers_Email UNIQUE (Email),
    CONSTRAINT UQ_Customers_Phone UNIQUE (Phone)
);

INSERT INTO Customers VALUES (1, 'rossakov@gmail.com', '555-123');
INSERT INTO Customers VALUES (2, 'blahun@gmail.com', '555-456');

select * from Customers

„CustomerID“ ja „Email“ on mõlemad kandidaadid primaarvõtmeks.


9. Alternate Key (Alternatiivvõti)

Selgitus: Kandidaatvõtmest, mida ei valitud primaarvõtmeks.

  • SQL-s realiseeritakse UNIQUE constraint’ina.
  • See on Candidate Key, mida ei valitud Primary Key-ks.

SQL näide koos veaga:

-- 9. ALTERNATE KEY (Alternatiivvõti)
CREATE TABLE Account (
    id INT PRIMARY KEY,
    Email VARCHAR(100) UNIQUE
);

INSERT INTO Account VALUES (1, 'marek@mail.com'); --primaar
INSERT INTO Account VALUES (2, 'mark@mail.com'); --alternatiiv

--VIGA: Email peab olema unikaalne
INSERT INTO Account VALUES (3, 'marek@mail.com');

Kasutatud allikad:

W3Schools – SQL Keys

GeeksforGeeks – Keys in Relational Model

Different Types of Database Keys

Kõik SQL Kood:

CREATE DATABASE keyss;
USE keyss;


-- 1. PRIMARY KEY (Primaarvõti)
CREATE TABLE Students (
    StudentID INT PRIMARY KEY,
    Name VARCHAR(50),
    Age INT
);
INSERT INTO Students VALUES (1, 'Martin', 20);
INSERT INTO Students VALUES (2, 'Illia', 21);
select * from Students

-- VIGA: StudentID = 1 juba olemas
INSERT INTO Students VALUES (1, 'Mark Jurgen', 20);



-- 2. FOREIGN KEY (Võõrvõti)
CREATE TABLE Departments (
    DepartmentID INT PRIMARY KEY,
    DepartmentName VARCHAR(50)
);
INSERT INTO Departments VALUES (1, 'IT'), (2, 'LOGIT');

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Name VARCHAR(50),
    DepartmentID INT,
    FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID)
);

INSERT INTO Employees VALUES (1, 'Marek', 1);

-- VIGA: DepartmentID=99 ei eksisteeri tabelis Departments
INSERT INTO Employees VALUES (2, 'Nikitos', 99);


-- 3. UNIQUE KEY (Unikaalvõti)
CREATE TABLE Users (
    UserID INT PRIMARY KEY,
    Email VARCHAR(100) UNIQUE,  -- Unikaalvõti
    Phone VARCHAR(20)
);
INSERT INTO Users VALUES (1, 'martin@mail.com', '555-111');
INSERT INTO Users VALUES (2, 'mark@mail.com', '555-222');

-- VIGA: email juba olemas
INSERT INTO Users VALUES (3, 'martin@mail.com', '555-111');


-- 4. Simple key ( Lihtvõti ) 
CREATE TABLE Products (
    ProductID INT PRIMARY KEY,  -- Lihtvõti / Primaarvõti
    ProductName VARCHAR(50)
);
INSERT INTO Products VALUES (1, 'PC'), (2, 'Playstation');
select * from Products



-- 5. COMPOSITE KEY (Koosvõti)
CREATE TABLE Kool (
    StudentID INT,
    CourseID INT,
    Grade CHAR(1),
    PRIMARY KEY (StudentID, CourseID)
);

INSERT INTO Kool VALUES (1, 2, 'A');
INSERT INTO Kool VALUES (1, 1, 'X');
select * from Kool





-- Compound Key 

CREATE TABLE Studentss (
    StudentID INT,
    CourseID INT,
    Grade CHAR(1),
    PRIMARY KEY (StudentID, CourseID)  -- Liitvõti
);

CREATE TABLE StudentAssignments (
    StudentID INT,
    CourseID INT,
    AssignmentName VARCHAR(50),
    FOREIGN KEY (StudentID, CourseID) REFERENCES Studentss(StudentID, CourseID)
);

INSERT INTO Studentss VALUES (1, 201, 'A');
INSERT INTO Studentss VALUES (2, 202, 'B');
INSERT INTO Studentss VALUES (1, 202, 'C');

INSERT INTO StudentAssignments VALUES (1, 201, 'Homework 1');
INSERT INTO StudentAssignments VALUES (1, 202, 'Project 1');
INSERT INTO StudentAssignments VALUES (2, 202, 'Lab 1');

select * from Studentss
select * from StudentAssignments




-- 7. SUPERKEY (Supervõti)
CREATE TABLE TTHKopilane (
    StudentID INT PRIMARY KEY,
    Name VARCHAR(50),
    Email VARCHAR(100) UNIQUE
);

INSERT INTO TTHKopilane VALUES (1, 'Nikita', 'nikita@mail.com');
INSERT INTO TTHKopilane VALUES (2, 'Nikitos', 'nikitos@mail.com');

select * from TTHKopilane



-- 8. CANDIDATE KEY (Kandidaatvõti)
CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    Email VARCHAR(100),
    Phone VARCHAR(20),
    CONSTRAINT UQ_Customers_Email UNIQUE (Email),
    CONSTRAINT UQ_Customers_Phone UNIQUE (Phone)
);

INSERT INTO Customers VALUES (1, 'rossakov@gmail.com', '555-123');
INSERT INTO Customers VALUES (2, 'blahun@gmail.com', '555-456');

select * from Customers

-- 9. ALTERNATE KEY (Alternatiivvõti)
CREATE TABLE Account (
    id INT PRIMARY KEY,
    Email VARCHAR(100) UNIQUE
);

INSERT INTO Account VALUES (1, 'marek@mail.com'); --primaar
INSERT INTO Account VALUES (2, 'mark@mail.com'); --alternatiiv

select * from Account

--VIGA: Email peab olema unikaalne
INSERT INTO Account VALUES (3, 'marek@mail.com');