sql-server - 从其他表中的数据和用户定义的约束条件创建表
问题描述
以下两个表用于定义用户及其各自的角色:
CREATE TABLE users
(
id INTEGER NOT NULL PRIMARY KEY,
userName VARCHAR(50) NOT NULL
)
CREATE TABLE roles
(
id INTEGER NOT NULL PRIMARY KEY,
role VARCHAR(20) NOT NULL
)
users_roles 表应包含每个用户及其角色之间的映射。每个用户可以有多个角色,每个角色可以有多个用户。修改提供的 SQLite 创建表语句,以便:
- 只有 users 表中的用户才能存在于 users_roles 中。
- 只有角色表中的角色才能存在于 users_roles 中。
一个用户只能拥有一个特定角色一次。
创建表 users_roles ( userId INTEGER, roleId INTEGER )
我努力了
CREATE TABLE users_roles
(
userId integer NOT NULL,
roleId integer NOT NULL,
PRIMARY KEY (userId, roleId),
FOREIGN KEY (userId) REFERENCES users(id),
FOREIGN KEY (roleId) REFERENCES roles(id)
)
它解决了许多这些问题,但有一个大问题。
如果角色表中有重复项,例如
id | role
---+-------
1 | hr
2 | hr
3 | cse
在 users_roles 表中仍然有
users.id | roles.id
---------+----------
1 | 1
1 | 2
用户 id 1 与角色 id 1 和 2 匹配。但是 1 和 2 具有角色 hr,因此它违反了最后一个要点。
user_roles
在创建表中我还需要做什么才能解决这个问题?
解决方案
通过添加约束来防止角色表上的重复:
ALTER TABLE [roles]
ADD CONSTRAINT [UC_roles_role] UNIQUE NONCLUSTERED ([role] ASC)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
推荐阅读
- javascript - 如何使 og: 元标记在 NextJS 中正常工作?
- c# - WPF c#相对源祖先数据绑定
- php - Amazon AWS:为图像设置签名有效负载是一种好习惯吗?
- c - gcc:创建静态链接到其所有依赖项的共享库
- html - 我无法将我的标签内嵌显示。这是怎么做的?
- javascript - 使用变量值作为另一个变量节点 js 的名称
- swift - 禁用滚动跳转到所选项目 - 第一次扩展节点 NSTreeView
- awk - 仅当当前行满足给定条件时才保留当前行和上一行
- javascript - 使用 AJAX 选择下拉菜单选择器时遇到问题
- swiftui - SwiftUI 领域内存问题。RAM使用量不断增加