我试图在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]。[角色]'不包含与外键中的引用列列表匹配的主键或候选键。如果引用的列是计算列,则应该保留它。
答案 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)
);
如果您删除主键,它将无法正常工作,并且与您的大厦相同。