【问题标题】:Using CHECK constraints for unique characters and from other columns PostgresSQL对唯一字符和其他列使用 CHECK 约束 PostgresQL
【发布时间】:2018-11-24 10:44:06
【问题描述】:

我有一个名为 STAFF 的设计表,它有 3 列用于 PostgreSQL。

staffId VARCHAR(6) PK,
firstName VARCHAR(50),
lastName VARCHAR(50)

我想建立一个 CHECK 约束,使 staffId 的前 2 个字母必须匹配 firstName 的第一个字母和 lastName 的第一个字母,并且最后四个数字不能与 staffId 中的另一个条目相同。

例如

John Smith - JS0001,
Lisa Jones - LJ0002

因此,如果 Joanne Smith 加入团队,那么 JS0002 将失败,因为 Lisa Jones 已经拥有 0002。

我该怎么做?

非常感谢。

【问题讨论】:

  • 您不应该存储该前缀。如果始终相同,只需创建一个连接该信息的视图
  • 我想要实现的目标是不是通常无法实现的目标?
  • 良好数据库设计的一条规则是不要存储可以(容易)从现有信息中获得的信息。

标签: sql postgresql constraints


【解决方案1】:

这似乎不是好的数据库设计。您应该简单地将StaffId 声明为serial 列并让它成为一个整数。瞧!完成了。

对于外键引用,整数通常比字符串更有效。他们还可以唯一标识员工,即使他们的名字发生了变化。

例如,在我居住的国家,女性(经常)和男性(有时)在结婚或离婚时改名。那会完全打乱你的计划。

说了这么多,你可以用uniquecheck约束做你想做的事:

alter table staff add constraint chk_staffId
    check (substr(staffId, 1, 1) = substr(firstname, 1, 1) and
           substr(staffId, 2, 1) = substr(lastname, 1, 1) and
           staffId ~ '^[A-Z][A-Z][0-9]{4}$'
          );

然后约束将被实现为表达式的索引:

create index unq_staffId_number on (substr(staffid, 3, 4));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    相关资源
    最近更新 更多