【问题标题】:Error Code: 3780. Referencing column 'deal_id' and referenced column 'd_id' in foreign key constraint 'cal_ibfk_1' are incompatible错误代码:3780。在外键约束“cal_ibfk_1”中引用列“deal_id”和引用列“d_id”不兼容
【发布时间】:2020-11-02 13:53:19
【问题描述】:
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 fiddle 中运行良好: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) 和我的不一样。我的数据类型是一样的。

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

【问题讨论】:

  • 代码必须有效。提供SHOW CREATE TABLE eng; 输出 - 完整且未更改。

标签: mysql sql foreign-keys


【解决方案1】:

我认为这里的问题是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 在逻辑上意味着“未知”,因此这样的值不可能连接回d_id eng 表中的主键。

【讨论】:

  • 我认为这里的问题是 cal 表中的 d_id 列未声明为 NOT NULL。 我怀疑。 “许多”一侧的可空列是常态。
  • OK...让 OP 也对此发表评论/验证。
猜你喜欢
  • 2020-08-01
  • 1970-01-01
  • 2020-12-14
  • 2020-05-22
  • 2021-08-31
  • 2019-06-23
  • 1970-01-01
  • 2021-06-01
  • 2021-06-12
相关资源
最近更新 更多