首页 > 解决方案 > 错误的 SQL 语法;')' 附近的语法不正确

问题描述

我正在使用连接到 Azure SQL 数据库的 Microsoft SQL Server Management Studio;通常,我习惯于使用 Oracle(我猜这只是一个菜鸟错误)。我到底做错了什么?这些是我收到的错误消息:

消息 102,级别 15,状态 1,第 11 行
')' 附近的语法不正确。

消息 102,级别 15,状态 1,第 42 行
')' 附近的语法不正确。

消息 102,级别 15,状态 1,第 54 行
')' 附近的语法不正确。

消息 102,级别 15,状态 1,第 66 行
')' 附近的语法不正确。

这是我的代码:

CREATE TABLE ElectiveCourses 
(
    ElectiveCourseID INT,
    ElectiveCoursePrefix CHAR(5),
    ElectiveCourseCode INT,
    ElectiveCreditHours INT,
    ElectiveCourseDescription VARCHAR(255),
    CatalogYearID INT,
    MajorID INT,
    PRIMARY KEY (ElectiveCourseID),
    FOREIGN KEY (CatalogYearID, MajorID)
);

CREATE TABLE Major 
(
    MajorID INT, 
    MajorTitle VARCHAR(50),
    MajorCode INT,
    MajorLevel CHAR(5),
    MajorDescription VARCHAR(255),
    PRIMARY KEY (MajorID)
);

CREATE TABLE CatalogYear 
(
    CatalogYearID INT,
    CatalogYear VARCHAR(10),
    CatalogYearStartTerm VARCHAR(10),
    CatalogYearEndTerm VARCHAR(10),
    PRIMARY KEY (CatalogYearID)
);

CREATE TABLE Student 
(
    StudentID INT,
    FirstName CHAR(25),
    LastName CHAR(10),
    MajorID INT,
    CatalogYearID INT,
    PhoneNumber VARCHAR(15),
    AreaCode INT,
    Address VARCHAR(50),
    State CHAR(50),
    PRIMARY KEY (StudentID),
    FOREIGN KEY (MajorID, CatalogYearID)
);

CREATE TABLE MajorCourses 
(
    MajorCourseID INT,
    MajorCoursePrefix CHAR(5),
    MajorCourseCode INT,
    MajorCreditHours INT,
    MajorCourseDescription VARCHAR(255),
    CatalogYearID INT,
    MajorID INT,
    PRIMARY KEY (MajorCourseID),
    FOREIGN KEY (CatalogYearID, MajorID)
);

CREATE TABLE Courses   
(
    CourseID INT,
    CoursePrefix CHAR (5),
    CourseCode INT,
    CreditHours INT,
    CourseDescription VARCHAR(255),
    CatalogYearID INT,
    MajorID INT,
    PRIMARY KEY (CourseID),
    FOREIGN KEY (CatalogYearID, MajorID)
);

标签: sqlazure-sql-database

解决方案


这些外键引用了哪些其他表/列?您需要提供该信息!

CREATE TABLE ElectiveCourses 
(
    .... all the columns ......
    PRIMARY KEY (ElectiveCourseID),
    FOREIGN KEY (CatalogYearID, MajorID) **REFERENCES dbo.OtherTable(col1, col2)**
);

此外,这些引用必须匹配另一个表的整个完整主键 - 您不能仅引用(复合)主键的一部分。外键中列的名称、顺序和数据类型必须与被引用表的主键完全匹配。

我没有在您的示例中找到任何其他表,其中显示的主键由(CatalogYearID, MajorID)- 所以这里的参考(以及其他一些参考)非常不清楚......

附带说明:我强烈建议明确命名您的约束:

CREATE TABLE dbo.ElectiveCourses 
(
    .... all the columns ......
    CONSTRAINT PK_ElectiveCourses        
        PRIMARY KEY CLUSTERED (ElectiveCourseID),
    CONSTRAINT FK_ElectiveCourses_OtherTable
        FOREIGN KEY (CatalogYearID, MajorID) 
        REFERENCES dbo.OtherTable(col1, col2)
);

如果您需要禁用或删除它们,这使得引用这些约束变得非常容易。


推荐阅读