Sql 外键引用多个表吗?

Sql 外键引用多个表吗?,sql,database,Sql,Database,我有三张桌子: Shirts(model, color) Gloves(model, color) Socks(model, color) 其中模型是所有3个表中的主键 现在我需要做另一张桌子: Products (model, price) 因此,在产品中,我需要在一列中从前3个表中获取所有模型。如何做到这一点?如果您的意思是在phpMyAdmin、MySQLWorkbench等环境中,您可以手动转到每个产品表'Shirt'、'手套'、'Socks',并将字段'Model'的引用/外键添加

我有三张桌子:

Shirts(model, color)
Gloves(model, color)
Socks(model, color)
其中模型是所有3个表中的主键

现在我需要做另一张桌子:

Products (model, price)

因此,在产品中,我需要在一列中从前3个表中获取所有模型。如何做到这一点?

如果您的意思是在phpMyAdmin、MySQLWorkbench等环境中,您可以手动转到每个产品表'Shirt'、'手套'、'Socks',并将字段'Model'的引用/外键添加到表'product'中的字段'Model'。实现这一点的方法完全取决于您使用的程序。请注意,在执行此操作之前,当然应该手动或通过SQL代码创建新表

多个表通过外键指向同一个其他表是没有问题的

如果您想为此编写SQL代码,可以使用类似这样的方法,也就是说,在表“Product”中使用三个外键,每个外键对应一个表。请注意,表袜子、衬衫和手套必须已经创建

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
) ;
您想要的方式是这样做三次,每个表一次。请注意,正如我前面所说,表产品必须已经创建

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
);

在我看来,你设计错了。我认为,作为问题下的评论,说产品应该由另外三个表引用是错误的

您不应该为衬衫、手套或袜子创建单独的桌子。当你开始卖帽子、裤子或鞋子时,你会怎么做?你会为所有这些创建新表吗?当然不是——这些只是服装产品类型

So-创建一个包含所有类型的表;当出现新类型时,只需将新行添加到该表中,并从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表到其他每个表创建一个外键。但是,除非所有三个表中都存在每个产品,否则无法从其他表(衬衫、手套、袜子)中创建外键。衬衫、手套和袜子中的外键基本上是这样的:在插入Products表之前,请确保其他三个表中的每一个表中都有具有相同键的记录

如其他海报所建议的,最好考虑稍微不同的设计,例如在产品表中添加一个类型列。


此外,按照惯例,表名应为单数产品、衬衫、手套、袜子

products应该是基表,其他3个应该使用外键引用它。为了将三个原始表中的模型列联合起来,作为大表的集合主键,仅在每个小表中使用模型主键是不够的。模型编号、代码或用于标识模型的任何内容在所有三个表中都应该是唯一的。如果有型号为1101的袜子和型号为1101的手套,那么即使三张小桌中的每一张都是PK,大桌的型号也不能PK。好的,你会说没有重叠的模型。。。请注意,Oracle将要求所有三个表中的UNION ALL模型不为null且不唯一。不空是容易的;但是,Oracle必须知道unique,而不是通过查看数据并看到三个表之间没有重复项;这一定是Oracle可以依赖的约束。那么,你打算怎么做?可以这样做,例如,使用联合所有三个表上的物化视图和物化视图上的PK。。。对于您的用例来说,这真的合理吗?为什么要标记SQL Server和Oracle?请只标记您实际使用的RDBMS。您能让它工作吗?我认为Product表的创建会失败。我还没有测试它,我试图给出OP可以采取的方法的总体视图。。。你为什么认为它会失败?