У внешнего ключа есть ссылки на несколько таблиц? - PullRequest
1 голос
/ 01 декабря 2019

У меня есть 3 таблицы:

Shirts(model, color)
Gloves(model, color)
Socks(model, color)

Где модель является первичным ключом во всех 3 таблицах

Теперь мне нужно создать другую таблицу:

Products (model, price)

Итакв продуктах мне нужно получить все модели из моих первых 3 таблиц в одном столбце. Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 01 декабря 2019

По-моему, вы спроектировали это неправильно. Предложение (как комментарий к вопросу о том, что на products должны ссылаться 3 другие таблицы) - опять же, на мой взгляд, - неправильно.

Не следует создавать отдельные таблицы для рубашек, перчаток илиноски. Что вы будете делать, когда начнете продавать шапки, брюки или обувь? Будете ли вы создавать новые таблицы для всех этих? Конечно, нет - это просто одежда (товары).

Итак - создайте одну таблицу, которая содержит все типы;когда появляется новый тип, просто добавьте новую строку в эту таблицу и сделайте ссылку на нее из таблицы products.

Примерно так:

SQL> create table product_type
  2    (id_type       number primary key,
  3     name          varchar2(30)
  4    );

Table created.

SQL> create table products
  2    (id_product    number primary key,
  3     id_type       number references product_type,
  4     color         varchar2(20),
  5     price         number
  6    );

Table created.

SQL> insert into product_type
  2    select 1, 'shirt' from dual union all
  3    select 2, 'glove' from dual union all
  4    select 3, 'socks' from dual;

3 rows created.

SQL> insert into products
  2    -- shirt
  3    select 100, 1, 'red',  100 from dual union all
  4    -- gloves
  5    select 101, 2, 'blue', 150 from dual;

2 rows created.

SQL>

А вот и обувь:

SQL> insert into product_type
  2    select 4, 'shoes' from dual;

1 row created.

SQL> insert into products
  2    select 113, 4, 'brown', 400 from dual;

1 row created.

SQL>

Вывод: прочитайте о нормализация .


Если кто-то скажет, что «цвета должны быть в отдельной таблице», ну, возможно, это тоже не будет плохой идеей. Кроме того, нужно ли расширять таблицу products на столбец даты (который будет показывать, какая цена действовала в определенный период)? Неплохая идея. Есть множество опций, которые вы можете включить в модель. Я просто пытался указать вам правильное направление.

0 голосов
/ 02 декабря 2019

Внешний ключ может быть создан из таблицы «Продукты» для каждой из других таблиц. Однако создание внешнего ключа из каждой из других таблиц (рубашки, перчатки, носки) невозможно (если каждый продукт не существует во всех трех таблицах). Внешний ключ от Shirts, Gloves и Socks в основном сказал бы: перед вставкой в ​​таблицу Products убедитесь, что в каждой из трех других таблиц есть запись с таким же ключом.

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

Кроме того, условно имена таблиц должны быть в единственном числе (Product, Shirt, Glove, Sock).

0 голосов
/ 01 декабря 2019

Если вы имеете в виду в таких средах, как phpMyAdmin, MySQLWorkbench и т. Д., Вы можете просто вручную перейти к каждой таблице продуктов «Рубашка», «Перчатки», «Носки» и добавить ссылочный / внешний ключ поля «Модель» в поле «Модель». поле «Модель» в таблице «Продукт». Способ сделать это полностью зависит от программы, которую вы используете. Обратите внимание, что, конечно, вы должны создать новую таблицу вручную или с помощью кода SQL, прежде чем сделать это.

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

Есливы хотите написать SQL-код для этого, вы можете использовать что-то вроде этого, наоборот (используйте три внешних ключа в таблице «Product», по одному для каждой другой таблицы). Обратите внимание, что таблицы Socks, Shirts и Gloves должны быть уже созданы.

DROP TABLE IF EXISTS `Product` ;
CREATE TABLE `Product` (
`Color` varchar(8),
`Model` varchar(14),
PRIMARY KEY(`Model`),
FOREIGN KEY('Model') REFERENCES `Socks`(`Model`) ON DELETE CASCADE,
FOREIGN KEY('Model') REFERENCES `Gloves`(`Model`) ON DELETE CASCADE,
FOREIGN KEY('Model') REFERENCES `Shirts`(`Model`) ON DELETE CASCADE
) ;

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

DROP TABLE IF EXISTS `Socks` ;
CREATE TABLE `Socks` (
`Color` varchar(8),
`Model` varchar(14),
PRIMARY KEY(`Model`),
FOREIGN KEY('Model') REFERENCES `Product`(`Model`) ON DELETE CASCADE
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...