如何根据其内容更改Postgres表数据?

时间:2010-06-16 22:18:05

标签: postgresql

这可能是一个非常简单的问题,但我很难找到合适的关键字在Google上找到它。

我有一个Postgres表,其内容中包含一个名为content_type的文本类型列。它存储了该行中存储的条目类型。

只有大约5种不同的类型,我决定将其中一种更改为在我的应用程序中显示为其他内容(我直接显示这些内容)。

令我震惊的是,我的视图由我的数据库模型决定很有趣,我决定将存储在我的数据库中的类型转换为整数,并使用转换的常量枚举我的应用程序中的可能类型他们进入他们的显示名称。这样,如果我再次想要改变任何类别名称,我可以通过改变一个常数来改变它。我也有预感,存储整数可能比在数据库中存储文本更有效。

首先,快速门槛问题,这是一个好主意吗?任何反馈或我遗漏的任何内容?

第二,我的主要问题是,我可以输入什么Postgres命令进行这样的更改?我想我可以从将旧的content_type列重命名为old_content_type然后创建一个新的整数列content_type开始。但是,什么命令会查看行的old_content_type并根据该行填写新的content_type列?

2 个答案:

答案 0 :(得分:1)

如果您发现需要更改显示值,那么是的,不将它们存储在数据库中可能是个好主意。整数也可以更有效地存储和搜索,但除非你有数百万行,否则我真的不会担心它。

您只需运行更新即可填充新列:

update table_name set content_type = (case when old_content_type = 'a' then 1 
  when old_content_type = 'b' then 2 else 3 end);

如果您使用的是Postgres 8.4,那么使用enum type而不是普通整数可能是个好主意。

答案 1 :(得分:1)

理想情况下,这些字段引用包含类型定义的表。这应该通过外键约束。这样您就知道您的数据库是干净的并且没有无效值(即参照完整性)。

有很多方法可以解决这个问题:

  1. 每个字段都有一个表,可以包含多个值(例如枚举),这是最明显的 - 但是当你有一个需要很多属性的表时它就会崩溃。

  2. 您可以使用Entity-attribute-value model,但请注意,这很容易滥用,并在事情发展时导致问题。

  3. 您可以使用或参考我的实施解决方案PET (Parameter Enumeration Tables)。这是介于1和1之间的中途住宅。 2。