Добавить или добавить ограничение для ограничений внешнего ключа - PullRequest
0 голосов
/ 20 января 2019

Термин «ограничение внешнего ключа» часто отбрасывается.И я просто хочу уточнить, что это точное значение.У нас есть стол сотрудников и стол филиалов.Таблица сотрудников была создана первой, но она должна иметь ограничение внешнего ключа для branch_id, которое ссылается на первичный (суррогатный) ключ id в таблице филиалов:

CREATE TABLE employees (
  id INT AUTO_INCREMENT,
  first_name VARCHAR(40),
  last_name VARCHAR(40),
  birth_day DATE,
  sex BOOLEAN,
  salary INT,
  supervisor_id INT,
  branch_id INT,
  PRIMARY KEY(id)
)

CREATE TABLE branches (
  id INT AUTO_INCREMENT,
  branch_name VARCHAR(40),
  manager_id INT,
  manager_start_date DATE,
  PRIMARY KEY(id),
  FOREIGN KEY(manager_id) REFERENCES employees(id) ON DELETE SET NULL
)

А теперь мы добавим ограничения внешнего ключа:

ALTER TABLE employees
ADD FOREIGN KEY(branch_id)
REFERENCES branches(id)
ON DELETE SET NULL;

ALTER TABLE employees
ADD FOREIGN KEY(supervisor_id)
REFERENCES employees(id)
ON DELETE SET NULL;

Обратите внимание, здесь я использую Add Foreign Key, а не Add Constraint constraint_name.Вот пример использования ADD CONSTRAINT:

ALTER TABLE users
ADD CONSTRAINT check_users_age 
CHECK (age>=18 AND city='Philadelphia');

Является ли ADD FOREIGN KEY и ADD CONSTRAINT constraint_name синонимами?Действительно ли ADD FOREIGN KEY добавляет ограничение без имени?И если ADD FOREIGN KEY добавляет имя, как я могу найти его в mysql?

1 Ответ

0 голосов
/ 20 января 2019
  • Явное именование ограничения, т. Е. Использование CONSTRAINT <name> FOREIGN KEY ... необязательно. Если вы этого не сделаете, то есть просто наберите FOREIGN KEY ..., система сгенерирует имя.

  • Эффекты, которые имеет ограничение, не зависят от его имени. Таким образом, оба, в явном виде именование ограничения, а не действия, являются синонимом-ish - то есть, за исключением имени.

  • Вы можете запросить ограничения из каталога, например, от information_schema.key_column_usage.

Рассмотрим следующий пример:

CREATE TABLE a
             (id integer,
              PRIMARY KEY (id));

CREATE TABLE b
             (id integer,
              PRIMARY KEY (id));

CREATE TABLE x
             (a integer,
              b integer,
              FOREIGN KEY (a)
                          REFERENCES a
                                     (id),
              CONSTRAINT fancy_name
                         FOREIGN KEY (b)
                                     REFERENCES b
                                                (id));

SELECT table_name,
       column_name,
       constraint_name,
       referenced_table_name,
       referenced_column_name
       FROM information_schema.key_column_usage
            WHERE table_schema = database()
                  AND table_name = 'x';

Это приведет к чему-то вроде:

| table_name | column_name | constraint_name | referenced_table_name | referenced_column_name |
| ---------- | ----------- | --------------- | --------------------- | ---------------------- |
| x          | b           | fancy_name      | b                     | id                     |                    
| x          | a           | x_ibfk_1        | a                     | id                     |

DB Fiddle

Как видите, система выбрала имя для ограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...