错误代码:3780。引用列'deal_id'和外键约束'cal_ibfk_1'中引用的列'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

代码在DB小提琴中工作正常:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=4b0d9723ae09dcebc677d2f014161222

不在 Mysql 上工作。

这(错误号:3780 引用外键约束"%s"中的列"%s"和引用列"%s"不兼容)与我的不同。我的数据类型是相同的。

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

我认为这里的问题是cal表中的d_id列未声明为NOT NULL。 这意味着该表中的d_id值可能被NULL,因此不能引用回父eng表中的d_id。 若要解决此问题,请考虑对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)
);

cal表中d_id的潜在NULL值的问题是,NULL逻辑上表示"未知",因此此类值不可能连接回eng表中的d_id主键。

最新更新