1822 (HY000): 添加外键约束失败

问题描述

我的代码如下:

CREATE TABLE Mesas (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,Mesa CHAR(2) NOT NULL,dispobilidad BOOLEAN NOT NULL DEFAULT True,Cantidad_Asientos tinyint UNSIGNED NOT NULL DEFAULT 4
);

CREATE TABLE Reservacion (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,A_Nombre_de VARCHAR(50) NOT NULL,Fecha DATE NOT NULL,Cantidad_Personas tinyint UNSIGNED NOT NULL DEFAULT 1,Horario TIME NOT NULL,Email VARCHAR(50) NOT NULL DEFAULT "perenganito@gmail.com"
);

CREATE TABLE HorarioMesaManager (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,FOREIGN KEY (Mesa) REFERENCES Mesas (Mesa) ON DELETE CASCADE,FOREIGN KEY (Horario) REFERENCES Reservacion (Horario) ON DELETE CASCADE
);

CREATE TABLE ReservacionMesaManager (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,Mesas_a_Ocupar tinyint UNSIGNED NOT NULL,FOREIGN KEY (A_Nombre_de) REFERENCES Reservacion(A_Nombre_de) ON DELETE CASCADE,FOREIGN KEY (Mesa) REFERENCES Mesas(Mesa) ON DELETE CASCADE
);

但是我遇到了表“HorarioMesaManager”的以下错误

1822 (HY000):无法添加外键约束。缺少索引 对于引用表中的约束“horariomesamanager_ibfk_1” '台面'

对于表“ReservacionMesaManager”:

1822 (HY000):无法添加外键约束。缺少索引 对于引用表中的约束“reservacionmesamanager_ibfk_1” '保留'

我不知道为什么。有人可以帮我吗?

非常感谢:)

解决方法

考虑这个外键定义:

FOREIGN KEY (Mesa) REFERENCES Mesas (Mesa) ON DELETE CASCADE,

从逻辑上讲,外键应该指向 UNIQUEPRIMARY KEY —— 最好是后者。 MySQL 确实允许任何索引列的外键,但我不建议使用该“功能”(其他数据库不支持)。

主键是 ID。所以你的声明应该是这样的:

CREATE TABLE HorarioMesaManager (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,Horario TIME NOT NULL,MesaId INT NOT NULL,FOREIGN KEY (MesaId) REFERENCES Mesas (ID) ON DELETE CASCADELETE CASCADE
);

其他外键引用依此类推。