如何在列中存储不同类型?

时间:2016-08-25 16:46:33

标签: postgresql sqldatatypes

我是一名新手程序员,目前正在研究如何在表格列中存储PostgreSQL列类型。具体来说,我想创建一个包含名为' type'的列的表。存储以下类型之一:booleanintegertextenum。但是,从概念上讲,我希望用户存储他想要使用的值。应该都可以使用整数,一段文本或选项列表。请参阅下面的示例表。

id    |    type                             | default value
---------------------------------------------------------------
1     |    integer                          |        5
2     |    boolean                          |        
3     |    enum("red", "blue", "yellow")    |       red

最后一个案子让我困惑。由于我的知识有限,我知道创建一个包含type列且类型为enum("boolean", "integer", "text", "enum")的列的表是可行的,但我不知道如何允许样本表中的最后一个案例。看起来这只允许类型enum,但在这种情况下我无法指定默认值,例如red,因为红色未列在enum类型的选项中

我有两个问题:

  1. 在创建表格时,我会为名为type的列指定哪种类型?
  2. 如何在示例表中存储第三条记录,以便我还可以存储默认值,以便我仍然可以检查默认值是否实际适合所选类型?
  3. 非常感谢任何答案或帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为你混淆/混合了许多不同的东西。

关于枚举类型

您可以将表格的列声明为enumerated type。为此,您需要定义类型:

CREATE TYPE my_color_enum AS ENUM ( 'red', 'blue', 'yellow' );

然后在表中使用它就像任何其他类型一样:

CREATE TABLE test ( column1 my_color_enum );

如果您需要为column1分配默认值,则只允许您定义ENUM类型中存在的默认值,例如,当有效时

CREATE TABLE test ( column1 my_color_enum default 'red');

不是,会产生错误:

CREATE TABLE test ( column1 my_color_enum default 'green' );

因为您的类型中不存在"green"值。错误消息看起来像这样(这是一个松散的翻译,而不是确切的错误消息):

  

枚举my_color_enum的输入值无效:“green”

在一列中存储不同的数据类型

这似乎是一个糟糕的设计,但如果你真的需要它,而宁愿避免text数据类型然后来回转换,你可以使用jsonjsonb等等所述...

如果您决定使用存储数据类型的查找表,那么它会咬你。