Keys — Primary, Foreign, Unique

লেসন ১৮ / ৩৯

১. Primary Key (PK) ⭐

প্রতিটি row-কে অনন্যভাবে চিহ্নিত করে। এক table-এ একটিই PK, NULL হতে পারবে না।

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100)
);

২. Foreign Key (FK)

এক table-এর column অন্য table-এর PK-কে নির্দেশ করে — সম্পর্ক তৈরি করে।

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    total DECIMAL(10,2),
    FOREIGN KEY (user_id) REFERENCES users(id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

-- Referential Actions
-- CASCADE   → parent পরিবর্তন/মুছলে child-ও
-- SET NULL  → child-এর FK NULL হবে
-- RESTRICT  → parent পরিবর্তন নিষিদ্ধ (default)

৩. Unique Key

ডুপ্লিকেট মান নয়, কিন্তু NULL থাকতে পারে। একাধিক Unique থাকতে পারে।

CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(150) UNIQUE,
    phone VARCHAR(20) UNIQUE
);

ALTER TABLE users ADD CONSTRAINT uq_email UNIQUE (email);

৪. Composite Key

একাধিক column মিলে PK/UK।

CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id),
    FOREIGN KEY (order_id) REFERENCES orders(id),
    FOREIGN KEY (product_id) REFERENCES products(id)
);

৫. Candidate Key

যে column-গুলো অনন্যভাবে row চিহ্নিত করতে পারে। একটি PK হয়, বাকিগুলো Alternate Key।

Natural Key vs Surrogate Key

  • Natural Key — বাস্তব জগতের মান (email, NID)
  • Surrogate Key — system-generated (AUTO_INCREMENT) ⭐ সুপারিশকৃত

সম্পূর্ণ উদাহরণ

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) UNIQUE
);

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    category_id INT NOT NULL,
    name VARCHAR(100) NOT NULL,
    sku VARCHAR(20) UNIQUE,
    price DECIMAL(10,2),
    FOREIGN KEY (category_id) REFERENCES categories(id)
);

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(150) UNIQUE,
    username VARCHAR(50) UNIQUE
);

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    total DECIMAL(10,2),
    FOREIGN KEY (user_id) REFERENCES users(id)
);