【问题标题】:Can't add foreign key to table MariaDB/MySQL无法将外键添加到表 MariaDB/MySQL
【发布时间】:2022-01-26 08:44:30
【问题描述】:

我正在 MariaDB 10.6 数据库中为 TPC-H 基准测试创建表。 CREATE TABLE 工作正常,但添加 FOREIGN KEY 失败。 我尝试关注mariadbtutorialdocumentation,但这也不起作用。

我怀疑:

  • FOREIGN KEY 的语法错误
  • 引用外键的列中的数据类型错误。
  • 引用外键的列应该是索引
  • dbgen 从 TPC-H 基准生成的数据有问题。

发生的错误:

  • 警告 150:使用外键 (N_REGIONKEY) 约束更改表 bazatest2.nation 失败。列“N_REGIONKEY”的字段类型或字符集与引用的列“R_REGIONKEY”不匹配。 尝试将 BIGINT NOT NULL 更改为 BIGINT UNSIGNED NOT NULL 但出现不同的错误:

  • 当我尝试在应该引用外键的列中将 UNSIGNED 添加到 BIGINT 时出现错误 1452。

包含创建的部分文件:

DROP TABLE IF EXISTS NATION CASCADE;
CREATE TABLE NATION (
    N_NATIONKEY     SERIAL PRIMARY KEY,
    N_NAME          CHAR(25),
    N_REGIONKEY     BIGINT UNSIGNED NOT NULL,  -- references R_REGIONKEY
    N_COMMENT       VARCHAR(152)
);
DROP TABLE IF EXISTS REGION CASCADE;
CREATE TABLE REGION (
    R_REGIONKEY SERIAL PRIMARY KEY,
    R_NAME      CHAR(25),
    R_COMMENT   VARCHAR(152)
);

具有外键约束的文件部分:

ALTER TABLE NATION ADD CONSTRAINT FOREIGN KEY (N_REGIONKEY) REFERENCES REGION(R_REGIONKEY);

我昨天尝试通过更改 alter table 添加约束外键的语法并搜索解决方案来解决这个问题,但没有找到解决方案。 最有可能是引用外键的列应该是索引,或者多个错误, 但我不知道我应该在我的代码中更改什么。

【问题讨论】:

  • 助您一臂之力,化繁为简! IE。删除所有不需要重现问题的表/列/fk。
  • @jarlh 重现问题(7 个中的 1 个,但它们是相同的)您只需要创建表国家、创建表区域和最后一个更改表。
  • 既然您知道需要什么,您可以从问题中删除其余内容。
  • @WojciechCode SERIAL 中的问题是 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的别名。将数据类型更改为 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT。
  • 未转载。 dbfiddle.uk/…

标签: mysql sql database mariadb benchmarking


【解决方案1】:

语法错误,用这个

ALTER TABLE NATION ADD CONSTRAINT NATION_FK FOREIGN KEY (N_REGIONKEY) REFERENCES REGION(R_REGIONKEY);

【讨论】:

  • 请在您的答案中添加一些解释,以便其他人可以从中学习
【解决方案2】:

感谢所有回答, 我将 UNSIGNED 添加到 BIGINT,但这不是我问题的主要来源。 问题是我从主键值从 0 开始的文件中导入了数据。 Here 我发现在 MariaDB/MySQL 中,如果主键为 0,它会自动分配第一个值。它改变了 0, 1, 2 到 1, 1, 2 并发生错误。 有两种选择:

  • 更改 dbgen 的设置(程序为 TPC-H 基准生成数据)。 可能的选项有:INFORMIX、DB2、TDAT (Teradata)、SQLSERVER、SYBASE、ORACLE、VECTORWISE。选项代表数据库语法,没有 MYSQL 选项。 dbgen 创建“|”带有此表记录的分隔文件 (.tbl)。 我使用了 ORACLE,它生成了主键从 0 开始的文件。 如果您知道哪个选项与 MySQL 语法最相似并且包含从 0 开始的键,您可以发表评论。
  • 或者是否有任何自动软件会在这个文件的主键上加 1。虽然 NATION 和 REGION 表不是那么大(20、5),但其他一些表(为了清楚起见,我从这个问题中删除了)将有超过 100 000 条记录。

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 2020-08-27
    • 2016-02-16
    • 2013-02-26
    • 2017-05-10
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    相关资源
    最近更新 更多