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
主键。