外键的SQL语法错误

时间:2014-11-18 11:51:10

标签: sql sql-server database sql-server-2008

现在我有桌位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]。[条件]'不包含与外键中的引用列列表匹配的主键或候选键。如果引用的列是计算列,则应该保留它。  

2 个答案:

答案 0 :(得分:2)

错误是正确的。 check约束中不允许使用子查询。

但是,您已经在user_namelikes(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]),

);