努力找出关于外键引用的 MySQL create table 语句的语法错误

Struggling to figure out a syntax error for a MySQL create table statement in regards to a foreign key reference

我绞尽脑汁想弄清楚下面 属性 create table 语句中的第一个外键引用有什么问题。为了隔离错误,我尝试删除外键引用并仅使用 属性 table 中的第二个外键引用创建 table (即:vendorId -> Vendor(vendorId) ) 并且能够毫无问题地创建 table。因此,我相信我手上可能存在设计缺陷,这让我很担心。两个引用的 table 也已创建,所以这不是问题所在。帮助将不胜感激,谢谢! (如果我没有看到它的某种愚蠢的语法错误,我深表歉意)

错误出现在 属性 create table 语句的第 11 行: error #1064 你的 SQL 语法有误 第 11 行:PRIMARY KEY (pid, vendorId), 第 12 行:FOREIGN KEY (apptStatus) REFERENCES AgentSchedule(apptStatus)

这是 属性 table 引用 AgentSchedule table 以及供应商 table

的代码
CREATE TABLE Property(
     pid INTEGER, 
     vendorId INTEGER, 
     houseDescr CHAR(150), 
     photoCopy CHAR(5), 
     propertyAddr CHAR(50), 
     apptStatus CHAR(5) DEFAULT 'False',
     numVisits INTEGER, 
     propertyComments CHAR(150), 
     isEmpty CHAR(5),
     PRIMARY KEY (pid, vendorId),
     FOREIGN KEY (apptStatus) REFERENCES AgentSchedule(apptStatus)
         ON DELETE SET DEFAULT
         ON UPDATE CASCADE,
     FOREIGN KEY (vendorId) REFERENCES Vendor(vendorId)
         ON DELETE CASCADE
         ON UPDATE CASCADE,
     CONSTRAINT TOF CHECK(photoCopy IN ('True','False') 
     AND apptStatus IN ('True', 'False') 
     AND isEmpty IN ('True', 'False'))
)

这里是引用 table 的代码,对应于 属性 table.

中的第一个外键引用
CREATE TABLE AgentSchedule(
    aid INTEGER,
    propertyId INTEGER,
    apptTime DATE UNIQUE,
    apptStatus CHAR(5),
    sickOrHolidays CHAR(5),
    PRIMARY KEY (aid, propertyId),
    CONSTRAINT TOF CHECK( apptStatus IN ('True', 'False') 
    AND sickOrHolidays IN ('True', 'False'))
)

这里是 table 对应于 属性 table 中的第二个外键引用。

CREATE TABLE Vendor(
    vendorId INTEGER,
    name CHAR(50),
    phone INTEGER,
    faxNum INTEGER,
    PRIMARY KEY (vendorId),
    CONSTRAINT PHONE CHECK(Phone >= 1000000000 AND Phone <=  9999999999 
    AND faxNum>= 1000000000 
    AND faxNum <=  9999999999)
)

您的问题出在 ON DELETE SET DEFAULT 子句上。虽然 MySQL 识别该子句,但在 table 定义中不允许。来自 manual:

SET DEFAULT: This action is recognized by the MySQL parser, but both InnoDB and NDB reject table definitions containing ON DELETE SET DEFAULT or ON UPDATE SET DEFAULT clauses.

如果删除 SET DEFAULT 子句,table 的创建工作正常。 Demo。如果您需要此功能,您可以通过ON DELETE触发器实现它。