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

Tob*_*ias 12 sql postgresql constraints

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

但是,这个约束是如何应用的(SQL代码)?

gma*_*iar 21

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

CREATE TABLE names (
  name text CHECK namechk (char_length(name) <= 255)
)
Run Code Online (Sandbox Code Playgroud)

(namechk只是约束的名称)

ALTER TABLE例如,同样如下:

ALTER TABLE names
  ADD CONSTRAINT namechk CHECK (char_length(name) <= 255);
Run Code Online (Sandbox Code Playgroud)

  • 我是否使用`char_length`或`length`是否重要?我同时使用后者应用约束...... (2认同)
  • 在版本PostgreSQL 10.3中,`CREATE TABLE名称(名称文本CHECK namechk(char_length(name)&lt;= 255))不起作用,但是`CREATE TABLE名称(名称文本CHECK(char_length(name)&lt;= 255))`做 (2认同)

IMS*_*SoP 7

这里真的有三件事:

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

答案:

  1. varchar(N)在检查模式时,A会更明显,以及来自其他数据库的开发人员希望看到的内容。然而,正如你所说,以后更难改变。请记住,应用新的/修改的检查约束不是免费的 - 必须根据约束检查所有现有行,因此在大表上,需要大量读取。
  2. 检查约束的语法是CONSTRAINT name CHECK (condition)(或者只是CHECK (condition)并且 Postgres 本身会提供一个名称)在CREATE TABLE语句中,并且ALTER TABLE table_name ADD CONSTRAINT name CHECK (condition);. condition将是使用适当字符串函数的表达式,例如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 );我实际上无法想到命名约束的缺点