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

How to add a length constraint to a text field

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

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

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

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

namechk只是约束的名称)

同样适用于 ALTER TABLE 例如:

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

这里真的有三件事:

  1. 使用 text + 检查约束还是 varchar(N) 更好?
  2. 您将如何编写适当的检查约束?
  3. 您应该为约束命名,还是让系统自动分配名称?

答案:

  1. A varchar(N) 在检查架构时会更加明显,来自其他数据库的开发人员希望看到的内容。但是,正如您所说,以后很难改变。请记住,应用 new/modified 检查约束不是免费的 - 所有现有行都必须根据该约束进行检查,因此在大型 table 上,需要大量阅读。
  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 ); 我实际上想不出命名约束的 缺点