似乎在使用PostgreSQL(或其他支持它的数据库)时,最好使用TEXT
数据类型而不是character varying(NN)
,因为没有性能惩罚,并且可以通过删除和重新应用约束来调整最大可能长度,而不影响使用该字段的任何视图等。
但是,如何应用此约束(SQL代码)?
似乎在使用PostgreSQL(或其他支持它的数据库)时,最好使用TEXT
数据类型而不是character varying(NN)
,因为没有性能惩罚,并且可以通过删除和重新应用约束来调整最大可能长度,而不影响使用该字段的任何视图等。
但是,如何应用此约束(SQL代码)?
当您创建表格时,您可以进行以下操作之一:
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);
char_length
还是 length
有关系吗?我同时使用后者应用了约束... - TobiasPostgreSQL 10.3
中,CREATE TABLE names ( name text CHECK namechk (char_length(name) <= 255))
不起作用,但是 CREATE TABLE names ( name text CHECK (char_length(name) <= 255))
可以。 - deFreitasCONSTRAINT namechk CHECK
,而不是CHECK namechk (...)
。 - Sampson Crowleychar_length
会测量字符长度;length
会测量字节长度。https://dev59.com/o3I-5IYBdhLWcg3wq6Zo - vaer-k这里有三个问题:
text
+ 检查约束更好,还是使用 varchar(N)
更好?答案:
varchar(N)
更明显。但是,正如您所说,稍后更改它会更困难。请记住,应用新的/修改的检查约束不是免费的 - 所有现有行都必须根据约束进行检查,因此在大型表上需要进行大量读取。CONSTRAINT name CHECK (condition)
(或者只是 CHECK (condition)
,Postgres 本身会提供一个名称)在 CREATE TABLE
语句中,以及 ALTER TABLE table_name ADD CONSTRAINT name CHECK (condition);
。 condition
将是使用适当的字符串函数的表达式,例如: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 );
我实际上无法想出命名约束的缺点。
nvarchar
。 - Vivek S.