Sql server 使用其他表中的数据和用户定义的约束创建表

Sql server 使用其他表中的数据和用户定义的约束创建表,sql-server,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表应包含每个用户与其角色之间的映射。 每个用户可以有多

以下两个表用于定义用户及其各自的角色:

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 create table语句,以便:

  • 只有users表中的用户才能存在于users\u角色中
  • 只有角色表中的角色才能存在于用户\u角色中
  • 一个用户只能拥有一次特定角色

    创建表用户\u角色 ( 用户标识整数, roleId整数 )

  • 我试过了

    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,因此它违反了最后一点


    为了解决此问题,我还需要在“创建
    用户\u角色”表中执行哪些操作?

    通过添加约束来防止角色表上的重复:

    ALTER TABLE [roles] 
       ADD CONSTRAINT [UC_roles_role] UNIQUE NONCLUSTERED ([role] ASC)
                       WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
    

    是SQLLite还是SQL Server?问题在于
    角色
    表,而不是
    用户角色
    表。