【问题标题】:How to add a length constraint to a text field如何向文本字段添加长度约束
【发布时间】:2015-06-16 02:08:09
【问题描述】:

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

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

【问题讨论】:

  • 但是带有长度检查约束的文本列真的比 nvarchar 更有效吗?
  • @jarlh Postgres 没有 nvarchar
  • @jarlh See postgresql.org/docs/current/interactive/datatype-character.html "提示:这三种类型之间没有性能差异,除了使用空白填充类型时增加了存储空间,以及一些额外的CPU周期来检查长度存储到长度受限的列时。”
  • 感谢托比亚斯博士提出这个问题

标签: sql postgresql constraints


【解决方案1】:

当你创建表时,你可以做这样的事情,

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有关系吗?同时,我使用后者应用了约束...
  • ERROR: syntax error at or near "namechk" 在创建表的时候指定约束名好像不能指定
  • @deFreitas 你指的是哪个版本的 PostgreSQL?
  • 在版本 PostgreSQL 10.3 CREATE TABLE names ( name text CHECK namechk (char_length(name) &lt;= 255)) 不工作,但 CREATE TABLE names ( name text CHECK (char_length(name) &lt;= 255)) 工作
  • @deFreitas 你的语法不正确。应该是CONSTRAINT namechk CHECK,而不是CHECK namechk (...)
【解决方案2】:

这里真的有三件事:

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

答案:

  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) &lt;= 255
  3. 如果您想稍后管理约束,为约束添加名称非常有用。特别是,由于您使用它来获得灵活性,您可能希望编写代码来删除并重新创建具有新长度的约束。如果您只使用图形工具,这不是问题,但是如果您可以编写更改脚本,管理多个服务器(例如开发、测试和生产副本)会变得更加容易。使用命名约束,这就像 ALTER TABLE foo DROP CONSTRAINT ck_bar_length; ALTER TABLE foo ADD CONSTRAINT ck_bar_length CHECK ( char_length(bar) &lt;= 100 ); 我实际上想不出命名约束的缺点

【讨论】:

  • 是的,当然约束应该有名字;这就是为什么我说“使用 pgAdmin 之类的工具添加时”(它根据可能有用的模式构建名称)。
  • @Tobias 您使用的任何工具都将使用 some 名称创建它,根据某种算法生成。但是,当您在不同的时间在不同的地方跑步时,不能保证使用相同的名称。老实说,我想不出不使用你自己名字的理由。
  • 我不需要这样的保证。我会使用交互式工具一次,然后如果需要,我会使用它生成的 SQL 代码在其他地方应用相同的更改,或者将其存储在文件中。
  • @Tobias 这就是为什么不选择名称没关系的原因,但它本身并不是不选择的原因姓名。从字面上看,我能想到的唯一原因是节省 10 秒的打字时间,这是一个非常蹩脚的理由。
  • 如果您始终使用相同的工具并让它命名,您不必担心重复现有名称。
猜你喜欢
  • 2014-11-30
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2012-06-18
相关资源
最近更新 更多