SQL - Ограничения: Ваш ключ к целостности данных

Здравствуйте, будущие маги баз данных! Я рад быть вашим проводником в увлекательное путешествие в мир ограничений SQL. Как кто-то, кто teaches SQL более десяти лет, я могу заверить вас, что понимание ограничений похоже на解锁 secret superpower в управлении базами данных. Итак, погружаемся!

SQL - Constraints

Что такое ограничения SQL?

Представьте, что вы строите карточный домик. Каждая карта должна быть placed правильно, или вся структура может рухнуть. Ограничения SQL похожи на правила, которые держат ваш "дом из карт" баз данных устойчивым. Они обеспечивают, чтобы данные в ваших таблицах следовали определенным правилам, поддерживая точность и一致性.

Why Are Constraints Important?

Давайте поделимся быстрой историей. У меня был студент, который создал базу данных для зоомагазина без использования ограничений. Однажды они случайно ввели отрицательную цену для щенка. Внезапно люди начали получать деньги за adoption dogs! Это было хаос (но собаки были счастливы). Вот почему нам нужны ограничения - чтобы prevent такие забавные, но проблемные ситуации.

SQL Constraints: Lineup

Вот таблица основных ограничений SQL, которые мы будем исследовать:

Ограничение Описание
NOT NULL Обеспечивает, чтобы столбец не мог иметь значение NULL
UNIQUE Обеспечивает, чтобы все значения в столбце были разными
PRIMARY KEY Комбинация NOT NULL и UNIQUE
FOREIGN KEY Обеспечивает referential integrity между таблицами
CHECK Обеспечивает, чтобы все значения в столбце удовлетворяли определенному условию
DEFAULT Устанавливает значение по умолчанию для столбца
INDEX Используется для создания и быстрого retrieval данных из базы данных

Теперь давайте разберем их по одному.

Создание ограничений в SQL

Ограничения можно добавить при создании таблицы или позже с помощью statements ALTER TABLE. Давайте начнем с создания простой таблицы для нашего вымышленного зоомагазина:

CREATE TABLE pets (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
species VARCHAR(50) NOT NULL,
age INT CHECK (age >= 0),
price DECIMAL(10, 2) NOT NULL CHECK (price > 0),
adoption_date DATE DEFAULT NULL
);

Эта простая таблица уже включает несколько ограничений. Давайте разберем их:

NOT NULL Ограничение

Ограничение NOT NULL обеспечивает, чтобы столбец не мог иметь значение NULL. В нашем примере 'id', 'name', 'species', и 'price' все NOT NULL. Это означает, что каждая запись должна иметь эти детали заполненными.

name VARCHAR(50) NOT NULL,

UNIQUE Key Ограничение

Хотя мы не использовали UNIQUE здесь явно, стоит упомянуть. Ограничение UNIQUE обеспечивает, чтобы все значения в столбце были разными. Например, если мы хотели, чтобы у каждой собаки был уникальный номер чипа:

ALTER TABLE pets
ADD COLUMN microchip_number VARCHAR(20) UNIQUE;

DEFAULT Value Ограничение

Ограничение DEFAULT предоставляет значение по умолчанию для столбца, когда значение не указано. В нашем примере 'adoption_date' имеет значение по умолчанию NULL, что означает, что если дата не указана, она будет NULL.

adoption_date DATE DEFAULT NULL

PRIMARY Key Ограничение

Ограничение PRIMARY KEY уникально identifies каждую запись в таблице. Это комбинация NOT NULL и UNIQUE. В нашей таблице 'id' является primary key:

id INT NOT NULL PRIMARY KEY,

FOREIGN Key Ограничение

Ограничение FOREIGN KEY используется для предотвращения действий, которые destroy links между таблицами. Давайте добавим таблицу owners и свяжем ее с нашими pets:

CREATE TABLE owners (
owner_id INT NOT NULL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);

ALTER TABLE pets
ADD COLUMN owner_id INT,
ADD CONSTRAINT fk_owner
FOREIGN KEY (owner_id) REFERENCES owners(owner_id);

Теперь вы не можете добавить record с owner_id, который не существует в таблице owners. Это как убедиться, что у каждой собаки есть реальный дом!

CHECK Value Ограничение

Ограничение CHECK обеспечивает, чтобы все значения в столбце удовлетворяли определенному условию. В нашей таблице мы используем его, чтобы ensure age и price положительны:

age INT CHECK (age >= 0),
price DECIMAL(10, 2) NOT NULL CHECK (price > 0),

INDEX Ограничение

Хотя это не совсем ограничение, INDEXы критически важны для производительности базы данных. Они resemble index в конце книги, помогая SQL быстро находить данные:

CREATE INDEX idx_species ON pets(species);

Это создает индекс на столбец species, делая searches по species быстрее.

Удаление ограничений SQL

Иногда вам может потребоваться удалить ограничение. Вот как вы можете это сделать:

ALTER TABLE pets
DROP CONSTRAINT check_price;

Это удалит CHECK ограничение на столбец price.

Ограничения целостности данных: В了一起

Все эти ограничения работают вместе, чтобы обеспечить целостность данных. Они resemble иммунная система вашей базы данных, защищая ее от плохих данных. Давайте посмотрим на более сложный пример:

CREATE TABLE adoptions (
adoption_id INT NOT NULL PRIMARY KEY,
pet_id INT NOT NULL,
owner_id INT NOT NULL,
adoption_date DATE DEFAULT CURRENT_DATE,
adoption_fee DECIMAL(10, 2) CHECK (adoption_fee >= 0),
FOREIGN KEY (pet_id) REFERENCES pets(id),
FOREIGN KEY (owner_id) REFERENCES owners(owner_id),
UNIQUE (pet_id, adoption_date)
);

Эта таблица обеспечивает:

  1. Каждая adoption имеет уникальный ID (PRIMARY KEY)
  2. Каждая adoption связана с valid pet и owner (FOREIGN KEY)
  3. adoption fee не может быть отрицательным (CHECK)
  4. Если не указана дата adoption, она устанавливается на текущую дату (DEFAULT)
  5. Одна и та же собака не может быть adopted дважды в один день (UNIQUE kombinacija)

И вот и все! Вы теперь хорошо подготовлены, чтобы содержать ваши базы данных чистыми, consistent и свободными от ошибок с помощью ограничений SQL. Помните, что хорошо ограниченная база данных - это счастливая база данных. Счастливого кодирования, будущие magi данных!

Credits: Image by storyset