PHP / SQL / Mysql / phpmyadmin - внешние ключи - PullRequest
0 голосов
/ 02 мая 2018

Я строю магазин для школьных целей. Я закончил свой магазин, но я не присоединился к таблицам и использовал внешние ключи (требование), потому что я забыл ..

У меня новый вопрос о внешних ключах.

ТАБЛИЦА РЕЙТИНГА ПРОДУКТОВ:

rate_id (id of the rate),
rate, (stars 0 to 5)
comment (user input textarea),
user_id (id of the user who commented the product),
product_id (id of the product that was commented)

ТАБЛИЦА ПОЛЬЗОВАТЕЛЕЙ:

`id` (id of the user),
`email` (email of the user),
`name` (name of the user),
`age`,
`username`,
`password`,
`profile_pic`,
`role` (ADMIN/USER)´

Когда я вношу комментарий к продукту X (если (isset ($ _ POST ['comment_rating])):

$sql = mysqli_query($link, "SELECT id FROM users WHERE username='$user_id'");

, а затем и позже:

$sql = "INSERT INTO products_rating (rate, comment, user_id, product_id) 
            VALUES ('$rate_text', '$comment', '$user_id', '$product_id');

ЗАКЛЮЧИТЕЛЬНО: Что я хочу знать, что мне нужно изменить в моем коде, если я добавлю внешний ключ? И я должен добавить внешний ключ в этом конкретном случае? Я должен объединить все таблицы, и я не очень разбираюсь в соединениях / внешних ключах. Если я не ясно, дайте мне знать. Спасибо за помощь!

1 Ответ

0 голосов
/ 02 мая 2018

Идея внешнего ключа довольно проста.

В таблице products_rating мы храним значение для user_id.

И значение, которое мы там сохранили, представляет собой столбец id из строки в таблице user. Это устанавливает отношение между строкой в ​​products_rating и строкой в ​​user.

Мы могли бы получить имя и адрес электронной почты пользователя, который оставил рейтинг продукта

SELECT u.name
     , u.email
     , r.rate
     , r.comment
  FROM product_rating r
  JOIN user u 
    ON u.id = r.user_id 
 WHERE ... 

A FOREIGN KEY - это ограничение , которое реализует правило. Правило, которое мы хотим реализовать, заключается в том, что мы хотим разрешить хранить только допустимых user.id значений в product_rating.user_id.

Например, если мы попытаемся сохранить значение '42' в столбце product_rating.user_id, база данных будет проверять, чтобы значение '42' появилось в строке в таблице userid) столбец.

Синтаксис, который мы используем для реализации этого ограничения 1034 *, будет в таблице product_rating:

ALTER TABLE `product_rating` 
  ADD CONSTRAINT                  -- we are adding a constraint 
  `FK_product_rating_user`        -- the name we assign to the constraint
  FOREIGN KEY                     -- the type of constraint 
  (`user_id`)                     -- the column(s) in this table 
  REFERENCES                      -- refer to 
  `user`                          -- the name of the "foreign" table
  (`id`)                          -- the column(s) in the "foreign" table        

Мы можем добавить дополнительную конфигурацию, которая влияет на поведение ...

  ON DELETE RESTRICT 
  ON UPDATE CASCADE 

Это реализует правило ... если мы пытаемся присвоить значение столбцу user_id в этой таблице, и это значение не найдено в строке в столбце user table id, возникает ошибка, и утверждение не выполняется.

Это правило также гласит, что если мы попытаемся удалить строку из user, если в product_rating есть строки, имеющие значение user_id, которое соответствует значению id удаляемой строки , выдается ошибка, и инструкция не выполняется.

Правило также гласит, что мы обновляем строку в user и присваиваем новое значение столбцу id, чем любые строки в product_rating, имеющие значение user_id, соответствующее старому id значение будет обновлено, чтобы присвоить новое значение id столбцу user_id ... с сохранением отношения между строками.

Также обратите внимание, что это подразумевает отношения «один ко многим». Пользователь может относиться к нулю, одному или нескольким product_rating. product_rating ассоциируется с one user. (Если столбец user_id допускает сохранение значений NULL, значение NULL означает, что строка в product_rating имеет значение , а не , связанную с любым пользователем.)

Это всего лишь приблизительный обзор ограничений FOREIGN KEY.

Основная идея состоит в том, что мы устанавливаем отношение между строками, сохраняя общее значение. В нашем примере мы используем общее значение '42' в столбце id строки в таблице user и в столбце user_id одной (или нескольких) строк в таблице * 1083. * таблица.

Без ограничения внешнего ключа база данных позволяет нам сохранять любое значение в столбце user_id. Мы можем хранить «43» или «8670», и не имеет значения, появляются эти значения в user.id или нет.

Внешний ключ, который мы определили , ограничивает (ограничивает), какие значения мы можем хранить в столбце user_id. Когда мы пытаемся добавить или изменить строку в product_rating, база данных проверяет значение столбца user_id, и если значение, отличное от NULL, не ссылается на строку в user, возникает ошибка.


Обратите внимание, что ограничение внешнего ключа не приводит к автоматическому заполнению столбца user_id. Если мы хотим установить связь со строкой в ​​user, мы должны предоставить значение для user_id.

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