如何将长度约束添加到文本字段

时间:2015-04-10 11:14:20

标签: sql postgresql constraints

在使用PostgreSQL(或其他一些支持它的数据库)而不是TEXT时,最好使用character varying(NN)数据类型,因为没有性能损失和最大可能的长度可以通过删除和重新应用约束来调整,而不会影响使用该字段的任何视图等。

但是,如何应用此约束(SQL代码)?

2 个答案:

答案 0 :(得分:18)

创建表格时,您可以执行此类操作,

CREATE TABLE names (
  name text CHECK namechk (char_length(name) <= 255)
)

namechk只是约束的名称)

例如ALTER TABLE也是如此:

ALTER TABLE names
  ADD CONSTRAINT namechk CHECK (char_length(name) <= 255);

答案 1 :(得分:3)

这里有三件事:

  1. 使用text +检查约束或varchar(N)
  2. 是否更好?
  3. 您如何编写适当的检查约束?
  4. 您是否应该命名约束,或者指定自动名称?
  5. 数目:

    1. 检查架构时,varchar(N)将更加明显,而来自其他数据库的开发人员将会看到什么。但是,正如您所说,以后更难更改。请记住,应用新的/修改的检查约束不是免费的 - 必须根据约束检查所有现有行,因此在大型表上需要大量读取。
    2. 检查约束的语法是CONSTRAINT name CHECK (condition)(或只是CHECK (condition),而Postgres本身会在CREATE TABLE语句中提出一个名称,ALTER TABLE table_name ADD CONSTRAINT name CHECK (condition);condition将使用适当的string function表达,例如char_length(foo) <= 255
    3. 如果要稍后管理约束,则为约束添加名称非常有用。特别是,由于您使用它来提高灵活性,您可能希望编写代码以删除并使用新长度重新创建约束。如果您只使用图形工具,这不是问题,但如果您可以编写更改脚本,则管理多个服务器(例如开发,测试和生产副本)会变得更加容易。使用命名约束,这就像ALTER TABLE foo DROP CONSTRAINT ck_bar_length; ALTER TABLE foo ADD CONSTRAINT ck_bar_length CHECK ( char_length(bar) <= 100 );我实际上无法想到命名约束的缺点