如何向文本字段添加长度约束
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);
这里真的有三件事:
- 使用
text
+ 检查约束还是 varchar(N)
更好?
- 您将如何编写适当的检查约束?
- 您应该为约束命名,还是让系统自动分配名称?
答案:
- A
varchar(N)
在检查架构时会更加明显,来自其他数据库的开发人员希望看到的内容。但是,正如您所说,以后很难改变。请记住,应用 new/modified 检查约束不是免费的 - 所有现有行都必须根据该约束进行检查,因此在大型 table 上,需要大量阅读。
- 检查约束的语法是
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
.
- 如果您想稍后管理约束,为约束添加名称非常有用。特别是,由于您使用它是为了获得灵活性,您可能希望编写代码来删除并重新创建具有新长度的约束。如果您只使用图形工具,这不是问题,但如果您可以编写更改脚本,管理多个服务器(例如开发、测试和生产副本)会变得容易得多。使用命名约束,这会
ALTER TABLE foo DROP CONSTRAINT ck_bar_length; ALTER TABLE foo ADD CONSTRAINT ck_bar_length CHECK ( char_length(bar) <= 100 );
我实际上想不出命名约束的 缺点 。
似乎在使用 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);
这里真的有三件事:
- 使用
text
+ 检查约束还是varchar(N)
更好? - 您将如何编写适当的检查约束?
- 您应该为约束命名,还是让系统自动分配名称?
答案:
- A
varchar(N)
在检查架构时会更加明显,来自其他数据库的开发人员希望看到的内容。但是,正如您所说,以后很难改变。请记住,应用 new/modified 检查约束不是免费的 - 所有现有行都必须根据该约束进行检查,因此在大型 table 上,需要大量阅读。 - 检查约束的语法是
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
. - 如果您想稍后管理约束,为约束添加名称非常有用。特别是,由于您使用它是为了获得灵活性,您可能希望编写代码来删除并重新创建具有新长度的约束。如果您只使用图形工具,这不是问题,但如果您可以编写更改脚本,管理多个服务器(例如开发、测试和生产副本)会变得容易得多。使用命名约束,这会
ALTER TABLE foo DROP CONSTRAINT ck_bar_length; ALTER TABLE foo ADD CONSTRAINT ck_bar_length CHECK ( char_length(bar) <= 100 );
我实际上想不出命名约束的 缺点 。