在MySQL中实现c / c ++样式联合作为列

时间:2010-03-16 20:50:11

标签: mysql c unions

我有一个奇怪的需要,无法思考我的问题。由于关键字回收,伟大而强大的Google几乎没有帮助(正如您所见)。你能帮忙吗?

我想要做的是将多种类型的数据存储在MySQL的单个列中。

这是一个等同于C union的数据库(如果你搜索MySQL和Union,你显然会在SQL中的UNION关键字上得到很多东西。)

[后续案例和简化案例]因此,让我们说我们有人 - 有姓名 - 和STORMTROOPERS - 有TK号码。您不能同时拥有名称和TK编号。你要么是BOB SMITH - 或者 - TK409。

在C中,我可以将其表达为一个联盟,就像这样:

union {
        char * name;
        int tkNo;
      } EmperialPersonnelRecord;

这使得我要么在EmperialPersonnelRecord类型中存储指向char数组 ID的指针,而不是两者都存在。

我在列上寻找MySQL等价物。我的列将存储int,double或varchar(255)(或任何组合)。但只占用最大元素的空间。

这可能吗?

(当然,只要有足够的时间,金钱和意志,任何事情都有可能 - 我的意思是,如果我是穷人,懒惰并且在截止日期之前就有可能......也就是“开箱即用”)

4 个答案:

答案 0 :(得分:4)

如a1ex07所说,你可以通过存储字符串表示来实现。但是如果您担心空间,将实际值存储在几个NULLable列中可能会节省更多空间。

或者,创建辅助表并进行规范化,例如

你想要的:

TABLE1
|id|name_or_TK#|

你能做到:

TABLE1
|id|name|TK|

或者你可以做

TABLE1
|id|ST_or_human_flag|other columns common to humans and stormtroopers

TABLE2 - Names_of_humans
|id|name|

TABLE3 - TKs_of_STs
|id|TK|

答案 1 :(得分:1)

不,没有'union'列类型。但是,您可以创建一个足以容纳最大元素的列和另一个用作类型指示符的列。即。

... data VARCHAR(15), data_type enum('int','double','char')...

答案 2 :(得分:1)

C工会是处理这个问题的一种非常简单的方式。

您拥有的是多态数据类型。因此,解决问题的一种方法是切换到面向对象的数据库,或者是动态类型的数据库,就像某些“NoSQL”数据库一样。

如果你必须继续使用当前的关系数据库,你可以做标准的事情,即构建某种ORM - 对象关系映射器 - 来进行转换。一种方法是将公共(“基类”)字段与类型列一起放在主表中,然后使用类型列选择哪个“叶类”表包含其他字段。例如:

table Employee
    field id int
    field emp_type enum('human', 'stormtrooper')
    field salary int
    field division_id int
    field manager_id int

table HumanEmployee
    field emp_id int
    field name string

table StormtrooperEmployee
    field emp_id int
    field tk_number int

也就是说,* Employee表按雇员ID绑定到基本Employee表。

答案 3 :(得分:0)

我认为你应该有2个不同的列并相应地存储数据,当你检索时你可以将它们拼凑起来并像col1 + col2一样附加到full_name