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可以采取的方法的总体视图。。。你为什么认为它会失败?