PrimaryKey, ForeignKey и их особенности

241
26 ноября 2016, 20:13

Здравствуйте. Столкнулся с MySQL. Курс ознакомительный, но все же хотелось бы знать хотя бы азы. Нашел один пример:

 CREATE TABLE usr (
    usr_id  INT AUTO_INCREMENT NOT NULL,
    FIRST  VARCHAR(25) NOT NULL,
       surname  VARCHAR(50) NOT NULL,
       PRIMARY KEY(usr_id)
     ) ENGINE=MyISAM CHARACTER SET=UTF8;
  CREATE TABLE product (
       prod_id  INT AUTO_INCREMENT NOT NULL,
      name  VARCHAR(40) NOT NULL,
      descr  VARCHAR(255) NOT NULL,
      PRIMARY KEY(prod_id)
    ) ENGINE=MyISAM CHARACTER SET=UTF8;
   CREATE TABLE invoice (
    inv_id  INT AUTO_INCREMENT NOT NULL,
    usr_id  INT NOT NULL,
    prod_id  INT NOT NULL,
    quantity INT NOT NULL,
    PRIMARY KEY(inv_id),
    FOREIGN KEY (usr_id) REFERENCES usr(usr_id)
      ON UPDATE CASCADE
      ON DELETE RESTRICT,
    FOREIGN KEY (prod_id) REFERENCES product(prod_id)
      ON UPDATE CASCADE
      ON DELETE RESTRICT
  ) ENGINE=MyISAM CHARACTER SET=UTF8;

Суть следующая: таблица товаров, покупателей и таблица заказов. Вопросы:

  1. Первичный ключ и внешний - это, я так понимаю, одно и тоже для разных таблиц: к примеру, prod_id для таблици продуктов - PK, а для заказов - внешний?
  2. Строчка usr_id INT AUTO_INCREMENT NOT NULL, означает создание первичного ключа таблици покупаителей, ID увеличиваеться автоматом и не может быть нулевым?
  3. Что делает ENGINE=MyISAM CHARACTER SET=UTF8; (что - то с кодировкой) и обязательно ли это?
  4. В данном случае родительскими будут покупатели и продукти, таблица заказов - дочерняя?
  5. Запись FOREIGN KEY (usr_id) REFERENCES usr(usr_id) ON UPDATE CASCADE ON DELETE RESTRICT, показывает, что изменение записи продукт отображается в заказах, а изменение в заказе не отобразится на продукте (так было написано на сайте)? Правильно ли я понял, если убрать продукт то и заказ, связанный с ним уберется, а если, к примеру, покупатель отменил заказ, то товар остаеться в таблице товаров? И эти особенности (изменения) указываються всегда и только после внешних ключей родительских таблиц для данной дочерней при ее создании?
  6. Последний вопрос состоит в связях. Я читал.что в БД есть разные связи, например, один ко многим, многие ко многим и один к одному. Как в случае с вишеупомянутым примеров созданы связи? Ведь покупатель может заказать не один товар, а два и более? Это ведь не указывается конкретно или я чего - то не вижу? С самого начала я думал, что по сути одной записи соответствует другая. Или же именно благодаря этим пресловутым ключам и создаеться связь: один покупатель может иметь несколько товаров - один ко многим. Правильно лми я понимаю, корректно ли выражаюсь, если да.

P.S.: возможно многим вопросы покажутся профанскими, но для этого ведь и создан форум. Заранее благодарю того, у кого хватит терпения мне ответить.

Answer 1

В вашей схеме реализованы 2 сущности: покупатели и товары. Связь между ними многие-ко-многим, она осуществляется с помощью смежной таблицы: заказы.

  1. Внешние ключи в таблице "заказы" как раз и указывают идентификаторы в таблицах покупателей и товаров. Например, запись (1, 2, 3, 4) в таблице заказы будет показывать: 1-идентификатор заказа, 2-идентификатор пользователя, 3-идентификатор товара, 4-количество.
  2. Да, эта запись означает, что поле идентификатора не может быть нулевым и увеличивается автоматически
  3. Указывает кодировку и движок. Насколько я знаю, не обязательно, но желательно, особенно кодировка, потому что по умолчанию это не UTF-8
  4. Да. Подробности смотреть п. 1
  5. CASCADE означает, что измение записи в родительской таблице повлекут изменение в дочерней, а RESTRICT означает то, что база данных не позволит произвести изменения. То есть в вашем случае при попытке удаления товара выйдет ошибка, что связанные данные существуют в таблице заказов
  6. В смежной таблице связи многие-ко-многим учитывается то, что и покупатель может заказать несколько товаров, и один товар может быть заказан несколькими покупателями. Например, записи в таблице заказов:

    (1, 1, 1, 5) - пользователь 1 заказал товар 1 в кол-ве 5 штук

    (2, 1, 2, 6) - пользователь 1 заказал товар 2 в кол-ве 6 штук

    (3, 2, 2, 8) - пользователь 2 заказал товар 2 в кол-ве 8 штук

READ ALSO
INSERT INTO … SELECT

INSERT INTO … SELECT

Что делают эти операторы в пределах одного выражения? Впервые наткнулся на подобный синтаксисВроде:

247
Получение ID последнего добавленного елемента

Получение ID последнего добавленного елемента

Как получить id последнего добавленного елемента? Нашел следующую конструкцию SELECT LAST_INSERT_ID() НО на сколько она безопасна?

275
Как соединить несколько таблиц sql

Как соединить несколько таблиц sql

Имеется две таблицы: user, proc_leader

277
MySQL и дублирование первичного ключа

MySQL и дублирование первичного ключа

ЗдрафствуйтеУ меня такой вопрос

210