现在我有桌位CREATE TABLE [dbo].[Place] (
[Place_Id] INT IDENTITY (1, 1) NOT NULL,
[Name] VARCHAR (50) NOT NULL,
[Building_Date] DATE NULL,
[Longitude] VARCHAR (50) NULL,
[Latitude] VARCHAR (50) NULL,
[Location] VARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([Place_Id] ASC)
);
和表格Citeria CREATE TABLE [dbo].[Criteria] (
[Criteria] VARCHAR (50) NOT NULL,
[Place_Id] INT NOT NULL, PRIMARY KEY CLUSTERED ([Criteria], [Place_Id]), CONSTRAINT [FK_Criteria_ToTable] FOREIGN KEY (Place_Id) REFERENCES Place(Place_Id)
);
以及参考表格' [dbo]。[条件]'不包含与外键中的引用列列表匹配的主键或候选键。如果引用的列是计算列,则应该保留它。
答案 0 :(得分:2)
错误是正确的。 check
约束中不允许使用子查询。
但是,您已经在user_name
和likes(user_name)
之间有一个外键引用,因此这个条件已经存在。唯一真正需要检查的是user_name
不是NULL
,但是列的定义已经证实了这一点。
现在,还有其他问题。您的外键应该是主键或其他表中的唯一键。我认为这是你的意图:
CREATE TABLE [dbo].Normal_Upload
(
[User_Name] VARCHAR(50) NOT NULL ,
[Place_Id] INT NOT NULL,
[Image] IMAGE NOT NULL,
CONSTRAINT [FK_Normal_Upload] FOREIGN KEY (User_Name) REFERENCES Member(User_Name),
CONSTRAINT [FK_Normal_Upload_1] FOREIGN KEY (Place_Id) REFERENCES Place(Place_Id),
CONSTRAINT [FK_Normal_Upload_2] FOREIGN KEY (User_Name, Place_Id) REFERENCES Likes(User_Name, Place_Id)
);
作为命名注释。我认为表的主键应该包括表名。因此,对于Member_Name
表,请考虑User_Name
而不是Member
。
答案 1 :(得分:0)
错误的数据库设计,永远不要在引用键或主键中使用varchar或字符类型列(尽量避免使用)。
对于您的解决方案,使用int数据类型创建一个“useid”列并为其提供pk。并更新下表
CREATE TABLE [dbo].[Likes] (
[User_id] VARCHAR (50) Identity (1,1),
[User_Name] VARCHAR (50) NOT NULL,
[Place_Id] INT NOT NULL,
CONSTRAINT [PK_Likes] PRIMARY KEY CLUSTERED ([User_id] ASC, [Place_Id] ASC),
CONSTRAINT [FK_Likes_ToTable] FOREIGN KEY ([User_Name]) REFERENCES Normal ([User_Name]),
CONSTRAINT [FK_Likes_ToTable_1] FOREIGN KEY ([Place_Id]) REFERENCES [dbo].[Place] ([Place_Id]),
);