sql - 对唯一字符和其他列使用 CHECK 约束 PostgresSQL
问题描述
我有一个名为 STAFF 的设计表,其中包含 3 列用于 PostgreSQL。
staffId VARCHAR(6) PK,
firstName VARCHAR(50),
lastName VARCHAR(50)
我想建立一个检查约束,使staffId的前2个字母必须匹配firstName的第一个字母和lastName的第一个字母,并且最后四个数字不能与staffId中的另一个条目相同。
例如
John Smith - JS0001,
Lisa Jones - LJ0002
因此,如果 Joanne Smith 加入团队,那么 JS0002 将失败,因为 Lisa Jones 已经拥有 0002。
我怎样才能做到这一点?
非常感谢。
解决方案
这似乎不是好的数据库设计。您应该简单地声明StaffId
为一serial
列并让它成为一个整数。瞧!就这样完成了。
对于外键引用,整数通常比字符串更有效。他们还唯一标识员工,即使他们的名字发生了变化。
例如,在我居住的国家,女性(经常)和男性(有时)在结婚或离婚时改名。那将完全抛弃你的计划。
综上所述,你可以做你想做的事情unique
和check
约束:
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));
推荐阅读
- node.js - 如何在nodeJS中显示来自firebase数据库的数据
- java - maven-compiler-plugin 无法编译 Eclipse 没有问题的文件
- react-native-ios - 从 git 克隆时找不到 CFBundleIdentifier
- angularjs - AngularJS数据表总是显示没有找到匹配的记录
- angular - 如何使用 Visual Studio Code 将在 Visual Studio 2015 中开发的 Angular 4 项目使用到 Angular 6?
- java - 如何将远程配置获取时间保持 15 分钟
- docusignapi - 有没有办法在签署文件时创建自定义签名?
- django - 尝试将本地 django 连接到 Amazon RDS MySQL 数据库时出现 2026 SSL 连接错误
- javascript - 我们如何检查一个机器人是否在您的不和谐服务器中与另一个机器人
- python - 我已经设置了所有的头信息,但我仍然无法获取数据