Какими SQL-командами можно добавить ограничение (constraint) к существующей таблице?

Ответ

Для добавления ограничений используется команда ALTER TABLE. Основные типы ограничений и синтаксис:

  1. PRIMARY KEY:
    ALTER TABLE employees ADD PRIMARY KEY (id);
  2. FOREIGN KEY:
    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customer_id
    FOREIGN KEY (customer_id) REFERENCES customers(id);
  3. UNIQUE:
    ALTER TABLE users ADD UNIQUE (email);
    -- Или с именем:
    ALTER TABLE users ADD CONSTRAINT uc_user_email UNIQUE (email);
  4. CHECK:
    ALTER TABLE products
    ADD CONSTRAINT chk_product_price CHECK (price > 0);
  5. NOT NULL (модификация столбца):
    ALTER TABLE employees ALTER COLUMN name SET NOT NULL;
    -- В MySQL: ALTER TABLE employees MODIFY name VARCHAR(100) NOT NULL;

Удаление ограничения:

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

Ответ 18+ 🔞

Э, слушай, про эти ваши таблицы в базе данных. Ну, там, где данные лежат, как на складе, только цифрами. Так вот, бывает, что склад надо переоборудовать, правила новые ввести. Для этого есть команда ALTER TABLE. С её помощью можно навесить на данные такие ограничения, что они аж пищать будут, но зато порядок будет, ёпта.

Смотри, какие бывают заморочки:

  1. PRIMARY KEY (Главный ключ): Это как паспорт у человека, уникальный и неповторимый. Навешиваешь — и всё, этот столбец становится царем горы.

    ALTER TABLE employees ADD PRIMARY KEY (id);

    Теперь у каждого работника свой id, и два одинаковых — ни хуя себе, нельзя.

  2. FOREIGN KEY (Внешний ключ): Это когда ты говоришь одному столбцу: «Смотри, дружок, твои значения должны быть такими же, как у того парня в другой таблице, иначе я тебя в пиздюрину». Порядок ссылок, блядь.

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customer_id
    FOREIGN KEY (customer_id) REFERENCES customers(id);

    Теперь в заказах customer_id может быть только тот, кто реально есть в таблице customers. Не придумаешь клиента из головы, хитрая жопа.

  3. UNIQUE (Уникальный): Не главный ключ, но тоже чтоб не повторялось. Например, почта. Двух васянов@пупкин.ру быть не должно, иначе пиздец в рассылке.

    ALTER TABLE users ADD UNIQUE (email);
    -- А можно и с именем, чтоб потом не орать "какое там ограничение, блядь?"
    ALTER TABLE users ADD CONSTRAINT uc_user_email UNIQUE (email);
  4. CHECK (Проверка): Это вообще песня. Ты можешь сказать: «Цена, сука, должна быть больше нуля!». И база сама будет следить.

    ALTER TABLE products
    ADD CONSTRAINT chk_product_price CHECK (price > 0);

    Попробуй запихнуть цену минус десять — получишь по ебалу от СУБД. Справедливо, внатуре.

  5. NOT NULL (Не пустой): Это не отдельное ограничение, а модификация столбца. Говоришь: «Это поле, блядь, обязательно к заполнению!».

    ALTER TABLE employees ALTER COLUMN name SET NOT NULL;
    -- В MySQL пишут по-другому, там своя атмосфера:
    -- ALTER TABLE employees MODIFY name VARCHAR(100) NOT NULL;

    Теперь без имени сотрудника не добавить. А то были у нас анонимусы, мудя.

А если накосячил и надо всё снести? Ну, бывает, перестарался с правилами. Тогда просто дропаешь эту хуйню по имени.

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

Главное — имя знать, а то будешь как Герасим из рассказа: «Мууу...», а удалить не сможешь, блядь. В рот меня чих-пых!