为什么要将 3 个表合二为一?数据库设计真的很糟糕。但这里有一种方法:
一张表将为您想要在最终表中的 3 个表列中的每一个列。我假设TableX_Hash
是同一类型,所以它仍然是一个唯一的列:
Table_All_in_One (
Table1_PK1,
Table1_PK2,
Table1_PK3,
# space just for clarity of grouping
Table2_PK1,
Table2_PK2,
Table3_PK1,
Table3_PK2,
Table3_PK3,
Table3_PK4,
Table3_PK5,
TableX_Hash # Assuming all the _Hash'es are the same type+length,
# otherwise, add Table1_Hash, Table2_Hash, Table3_Hash
# This can be your new primary key
)
主键 ( PKx
) 必须NULL
不仅在它们自己的表中。对于此表,它们必须允许空值。这个想法是这个新表的每一行将只保存其中一个表的数据。该行的其他列将为空。如果要将一个表的行与另一个表关联,可以将其添加到同一行或添加FK_Table1_Hash
,FK_Table2_Hash
以及FK_Table3_Hash
将引用TableX_Hash
记录值的列。
PS:我想知道您是否真正在寻找一张View
而不是这张非常糟糕的一体式桌子。
编辑:将它们组合成一个“不知道一个表可以有多少个主键”。根据您的评论:
将所有 _PK 连接到一列中:
Table_All_in_One (
New_PK,
TableX_Hash,
Table1_PKx, # Concatenated PKs of Table1
Table2_PKx, # Concatenated PKs of Table2, etc.
...,
# OR just one
TableX_PKs, # concatenate all the PK's into one VARCHAR field
# Add a pipe `|` between them optionally.
Table_Num # If using just one, then you'll need to store the table number
) 您将无法根据部分复合主键方便地选择记录。它总是必须的TableX_PKs = CONCAT_WS('|', Table1_PK1, Table1_PK2, ...)
。因此,您唯一的依赖是原始列中的 PK 数。