【发布时间】:2015-06-22 18:57:21
【问题描述】:
使用 PostgreSQL 9.2.4,我有一个表 users 与表 user_roles 的关系为 1:many。 users 表存储员工和其他类型的用户。
Table "public.users"
Column | Type | Modifiers
-----------------+-------------------+-----------------------------------------------------
uid | integer | not null default nextval('users_uid_seq'::regclass)
employee_number | character varying |
name | character varying |
Indexes:
"users_pkey" PRIMARY KEY, btree (uid)
Referenced by:
TABLE "user_roles" CONSTRAINT "user_roles_uid_fkey" FOREIGN KEY (uid) REFERENCES users(uid)
Table "public.user_roles"
Column | Type | Modifiers
-----------+-------------------+------------------------------------------------------------------
id | integer | not null default nextval('user_roles_id_seq'::regclass)
uid | integer |
role | character varying | not null
Indexes:
"user_roles_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"user_roles_uid_fkey" FOREIGN KEY (uid) REFERENCES users(uid)
如果user_roles.role_name 包含员工角色名称的相关行,我想确保users.employee_number 列不能是NULL。也就是说,我希望数据库强制执行约束,即对于某些角色,users.employee_number 必须有一个值,但对于其他角色则不然。
我怎样才能做到这一点,最好没有用户定义的函数或触发器?我发现(blog post、SO Answer)SQL Server 支持索引视图,这听起来很符合我的目的。但是,我认为物化视图在我的情况下不起作用,因为它们不是动态更新的。
【问题讨论】:
-
您能提供更多关于这些列的详细信息吗?也许您的问题还有其他解决方案。
-
@Gordon 当然,我更新了问题以稍微澄清用例。
-
如果您提供表定义(psql 中的
\d tbl)以及像始终一样提供您的 Postgres 版本,将会有所帮助。 -
@ErwinBrandstetter 我用请求的信息更新了这个问题以供后代使用。我还更新了表名以避免分散注意力的命名问题,即使这可能会让你的答案看起来很奇怪。我非常感谢您如何不断指出这些问题。 (虽然在我的实际数据库中名称很好,但在提取此问题的相关部分时我犯了一个错误。)
标签: postgresql database-design triggers constraints referential-integrity