错误代码:3780在外键约束“ cal_ibfk_1”中引用列“ deal_id”和引用列“ d_id”不兼容

问题描述

CREATE TABLE eng(
    d_id INT,min_call_time DATETIME DEFAULT NULL,max_call_time DATETIME DEFAULT NULL,call INT DEFAULT 0,min_meeting_time DATETIME DEFAULT NULL,max_meeting_time DATETIME DEFAULT NULL,cmeeting INT DEFAULT 0,activities INT DEFAULT 0,PRIMARY KEY (d_id)
);

CREATE TABLE cal(
    id INT,d_id INT,c_meetings INT,c_active INT,c_cancelled INT,min_start_time DATETIME,max_start_time DATETIME,PRIMARY KEY (id),FOREIGN KEY (d_id) REFERENCES eng(d_id)
);

错误

错误代码:3780。在外键约束'cal_ibfk_1'中引用列'deal_id'和引用列'd_id'不兼容。

我正在使用MysqL 8.0

代码可以很好地解决数据库问题:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=4b0d9723ae09dcebc677d2f014161222

不适用于MysqL

此(Error number: 3780 Referencing column '%s' and referenced column '%s' in foreign key constraint '%s' are incompatible)与我的不同。数据类型与我的相同。

非常感谢您能提供的任何帮助。

解决方法

我认为这里的问题是d_id表中的cal列未声明为NOT NULL。这意味着该表中的d_id值可能为NULL,因此无法在父d_id表中被引用回eng。要解决此问题,请考虑对cal表定义进行以下细微更改:

CREATE TABLE cal(
    id INT,d_id INT NOT NULL,-- change is here
    c_meetings INT,c_active INT,c_cancelled INT,min_start_time DATETIME,max_start_time DATETIME,PRIMARY KEY (id),FOREIGN KEY (d_id) REFERENCES eng(d_id)
);

请注意,即使没有隐式定义,MySQL中的主键列也隐式声明为NOT NULL。因此,您的eng表实际上定义为:

CREATE TABLE eng(
    d_id INT NOT NULL,...,PRIMARY KEY (d_id)
);

在子NULL表中d_id可能具有cal值的问题是,NULL在逻辑上表示“未知”,因此该值不可能重新连接到d_id表中的eng主键。