Что такое первичный ключ (Primary Key) и какова его роль в базах данных?

Ответ

Первичный ключ (Primary Key, PK) — это столбец или набор столбцов в таблице, который однозначно идентифицирует каждую запись. Его главная задача — обеспечивать целостность и уникальность данных.

Ключевые функции и свойства:

  1. Уникальность: Каждое значение первичного ключа в таблице должно быть уникальным. Не может быть двух записей с одинаковым PK.
  2. Отсутствие NULL: Первичный ключ не может содержать значения NULL. Каждая запись обязана иметь значение PK.
  3. Индексация: Большинство СУБД автоматически создают кластеризованный индекс для первичного ключа, что обеспечивает максимально быстрый доступ к данным при поиске по ключу.
  4. Связывание таблиц: PK используется для установления связей между таблицами. В другой таблице он выступает в роли внешнего ключа (Foreign Key), обеспечивая ссылочную целостность.

Пример в SQL:

CREATE TABLE users (
    id SERIAL PRIMARY KEY, -- `SERIAL` в PostgreSQL автоматически создает последовательность
    username VARCHAR(50) NOT NULL UNIQUE
);

Пример в Go с GORM: В Go ORM, таких как GORM, поле ID в структуре по умолчанию становится первичным ключом.

type User struct {
    gorm.Model // Включает поля ID, CreatedAt, UpdatedAt, DeletedAt.
               // ID uint `gorm:"primaryKey"` является первичным ключом.
    Name string
}

Ответ 18+ 🔞

А, слушай, про первичный ключ, да? Ну это ж, блядь, основа основ, хуй с горы всего этого реляционного пиздеца!

Представь себе таблицу в базе — ну, как список жильцов в домоуправлении, только без дураков. Так вот, первичный ключ — это такая, блядь, уникальная паспортная запись для каждой строчки. Его главная миссия — чтобы ни одна запись не совалась, как последняя манда с ушами, под видом другой.

Чем он, сука, знаменит:

  1. Уникальность, ёпта! Значение ключа должно быть одно на всю таблицу, как последняя бутылка в деревне. Двух одинаковых — нихуя! Иначе пиздец и бардак.
  2. Без пустот! Значение NULL — это как дырка от бублика. В первичном ключе такого не может быть в принципе. Каждая запись обязана иметь свой, блядь, идентификатор, хоть тресни.
  3. Индексация автоматом. Система обычно сама, хитрая жопа, строит по нему быстрый индекс, чтобы когда ты ищешь запись по ключу — бац, и она уже тут, в рот меня чих-пых!
  4. Связующее звено. Это главный крючок, за который цепляются другие таблицы. В соседней таблице этот же ключ будет торчать как внешний (Foreign Key), и за это держатся все связи, чтобы данные не разъебались в разные стороны.

Как это выглядит в SQL, на примере:

CREATE TABLE users (
    id SERIAL PRIMARY KEY, -- `SERIAL` в PostgreSQL — это магия, сам числа генерит.
    username VARCHAR(50) NOT NULL UNIQUE
);

А вот в Go с GORM — вообще красота: Там, если в структуру воткнуть gorm.Model, он сам, блядь, под капотом сделает поле ID первичным ключом. Удобно же, ёперный театр!

type User struct {
    gorm.Model // Внутри спрятано поле ID uint `gorm:"primaryKey"` — вот он, красавец!
    Name string
}

Вот и вся магия. Без этого — просто свалка данных, а с ним — уже, блядь, структурированный архив, где всё на своих местах.