引用两个表

时间:2014-05-30 10:43:54

标签: sql visual-studio-2012

我试图在Visual Studio 2012中创建数据库。我有三个表:

CREATE TABLE [dbo].[Users] (
    [user_id]   INT            IDENTITY (1, 1) NOT NULL,
    [user_name] NVARCHAR (MAX) NOT NULL,
    [user_pass] NVARCHAR (MAX) NOT NULL,
    [name]      NVARCHAR (MAX) NOT NULL,
    [Surname]   NVARCHAR (MAX) NOT NULL,
    [email]     NVARCHAR (50)  NOT NULL,
    PRIMARY KEY CLUSTERED ([user_id] ASC),
    UNIQUE NONCLUSTERED ([email] ASC)
);
CREATE TABLE [dbo].[Roles] (
    [user_id] INT NOT NULL REFERENCES Users(user_id),
    [role_id] INT NOT NULL,
    PRIMARY KEY CLUSTERED ([role_id] ASC, [user_id] ASC)
);

CREATE TABLE [dbo].[Apodosi_rolon] (
    [role_id] INT NOT NULL,
    [role_name] VARCHAR(50) NOT NULL, 
    PRIMARY KEY CLUSTERED ([role_id] ASC),
    CONSTRAINT [FK_ROLES_APODOSI+_ROLON]FOREIGN KEY ([role_id]) REFERENCES [Roles]([role_id])
);

Apodosi_rolon中的外键不起作用。我在这个问题中看到了如何创建这个约束:How to reference two tables in Visual Studio 2012 by adding foreign key?

但我仍然会收到此错误:

  

SQL71516 ::引用的表' [dbo]。[角色]'不包含与外键中的引用列列表匹配的主键或候选键。如果引用的列是计算列,则应该保留它。

2 个答案:

答案 0 :(得分:2)

您的数据结构对我没有意义。我希望有一个Users表,Roles表和一个UserRoles表。这些定义如下:

CREATE TABLE users (
     user_id int not null primary key
);

CREATE TABLE Roles (
    role_id INT NOT NULL,
    [role_name] VARCHAR(50) NOT NULL, 
    PRIMARY KEY CLUSTERED ([role_id] ASC)       
);

CREATE TABLE UserRoles (
    [user_id] INT NOT NULL REFERENCES Users(user_id),
    [role_id] INT NOT NULL REFERENCES Roles(role_id),
    PRIMARY KEY CLUSTERED ([role_id] ASC, [user_id] ASC)
);

显然,不同语言的事物名称可能不同。但是,有一个名为Roles的表,其中Role_Id 是主键,这没有任何意义。

此外,在这些表中,通常您希望主键是标识列,因此它们会自动递增。

答案 1 :(得分:0)

确保users表在user_id列中包含主键。 看到打击正在发挥作用。

CREATE TABLE Users( 
        user_id  INT   IDENTITY (1, 1) NOT NULL, 
        PRIMARY KEY CLUSTERED (user_id ASC) 
)

CREATE TABLE [dbo].[Roles] (
    [user_id] INT NOT NULL REFERENCES Users(user_id),
    [role_id] INT NOT NULL,
    PRIMARY KEY CLUSTERED ([role_id] ASC, [user_id] ASC)
);

如果您删除主键,它将无法正常工作,并且与您的大厦相同。