PostgreSQL - Ограничения: Ваш доброжелательный гид по целостности данных
Здравствуйте, будущие маги баз данных! ? Сегодня мы погружаемся в奇妙ный мир ограничений PostgreSQL. Не волнуйтесь, если вы новички; мы будем двигаться шаг за шагом, и к концу вы будете ограничивать данные как профессионал! Давайте начнем это захватывающее путешествие вместе.
Что такое ограничения?
Прежде чем мы углубимся, давайте поговорим о том, что такое ограничения. Представьте, что вы строите карточный домик. Каждая карта должна быть placed точно, иначе вся структура может рухнуть. Ограничения в базах данных похожи на правила для постройки этого карточного домика - они обеспечивают правильную структуру наших данных и их целостность.
Типы ограничений
PostgreSQL предлагает несколько типов ограничений. Давайте рассмотрим каждый из них с примерами и пояснениями.
Тип ограничения | Описание |
---|---|
NOT NULL | Обеспечивает, что столбец не может иметь значение NULL |
UNIQUE | Обеспечивает, что все значения в столбце различны |
PRIMARY KEY | Уникально идентифицирует каждую строку в таблице |
FOREIGN KEY | Связывает данные между таблицами |
CHECK | Обеспечивает, что все значения в столбце удовлетворяют определенному условию |
EXCLUSION | Обеспечивает, что если две строки сравниваются по указанному столбцу (столбцам) с использованием указанного оператора (операторов), то не все эти сравнения вернут TRUE |
Ограничение NOT NULL
Ограничение NOT NULL похоже на strict учителя, который не принимает пустые ответы на тесте. Оно обеспечивает, что столбец всегда должен содержать значение.
Давайте создадим таблицу для нашего вымышленного书店:
CREATE TABLE books (
book_id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
author VARCHAR(100) NOT NULL,
price DECIMAL(10, 2)
);
В этом примере, title
и author
являются NOT NULL, что означает, что каждая книга должна иметь заголовок и автора. Однако price
может быть NULL, возможно, для книг, которые еще не оценены.
Ограничение UNIQUE
Ограничение UNIQUE похоже на присвоение уникальных прозвищ вашим друзьям. Никто не может иметь одно и то же прозвище.
Давайте добавим ограничение UNIQUE к нашей таблице books
:
ALTER TABLE books
ADD CONSTRAINT unique_isbn UNIQUE (isbn);
Теперь, если мы попытаемся добавить две книги с одним и тем же ISBN:
INSERT INTO books (title, author, isbn) VALUES ('Book 1', 'Author 1', '1234567890');
INSERT INTO books (title, author, isbn) VALUES ('Book 2', 'Author 2', '1234567890');
Вторая вставка не удастся, сохраняя наши данные чистыми и уникальными!
Ограничение PRIMARY KEY
PRIMARY KEY похож на капитана спортивной команды - уникального и必需ого. Он уникально идентифицирует каждую строку в таблице.
Мы уже определили PRIMARY KEY в нашей таблице books
(book_id
), но давайте создадим другую таблицу для демонстрации:
CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE
);
Здесь, customer_id
是我们的 PRIMARY KEY. Он автоматически увеличивается и уникален для каждого нового клиента.
Ограничение FOREIGN KEY
FOREIGN KEY resemble подключения в социальной сети. Они связывают данные между таблицами.
Давайте создадим таблицу orders
, которая ссылается на нашу таблицу customers
:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INTEGER,
order_date DATE NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
Теперь мы не можем добавить заказ для клиента, который не существует в таблице customers
. Это похоже на попытку отправить письмо по адресу, который не существует!
Ограничение CHECK
Ограничение CHECK похоже наouncer в клубе, который обеспечивает, чтобы только правильные данные попали внутрь.
Давайте добавим ограничение CHECK к нашей таблице books
, чтобы обеспечить, что все цены на книги положительны:
ALTER TABLE books
ADD CONSTRAINT positive_price CHECK (price > 0);
Теперь, если мы попытаемся добавить книгу с отрицательной ценой:
INSERT INTO books (title, author, price) VALUES ('Cheap Book', 'Frugal Author', -5.99);
PostgreSQL вежливо откажется, сохраняя наши данные логичными и последовательными.
Ограничение EXCLUSION
Ограничение EXCLUSION похоже на сложное правило в настольной игре. Оно avanzado, но мощное, когда вам нужно.
Представьте, что мы планируем события и хотим обеспечить, что два события не перекрываются в одной комнате:
CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
room_no INTEGER,
event_start TIMESTAMP,
event_end TIMESTAMP,
EXCLUDE USING gist (room_no WITH =, tsrange(event_start, event_end) WITH &&)
);
Это обеспечивает, что для любых двух строк, не истинно, что и room numbers равны и временные диапазоны перекрываются.
Удаление ограничений
Иногда нам нужно удалить ограничения, как изменение правил нашей игры. Вот как мы можем удалить ограничения:
-- Удаление named ограничения
ALTER TABLE books DROP CONSTRAINT unique_isbn;
-- Удаление PRIMARY KEY
ALTER TABLE books DROP CONSTRAINT books_pkey;
-- Удаление FOREIGN KEY
ALTER TABLE orders DROP CONSTRAINT orders_customer_id_fkey;
Помните, что удаление ограничений должно быть done carefully, так как это может повлиять на целостность данных!
Заключение
Поздравления! Вы только что совершили грандиозное путешествие по ограничениям PostgreSQL. От NOT NULL до EXCLUSION, вы теперь имеете инструменты для сохранения ваших данных чистыми, последовательными и структурированными. Помните, использование ограничений похоже на создание прочного фундамента для дома - это может потребовать немного больше усилий заранее, но это.save вас от множества проблем в будущем.
Пока вы продолжаете свое путешествие с PostgreSQL, продолжайте экспериментировать с этими ограничениями. Попробуйте комбинировать их по-разному, и вы вскоре обнаружите, что создаете надежные и надежные designs баз данных. Счастливо ограничивайте!
Credits: Image by storyset