无法将外键添加到表 MariaDB/MySQL



我正在MariaDB 10.6数据库中为TPC-H基准创建表。CREATE TABLE工作正常,但添加FOREIGN KEY失败。我试着遵循mariadbtutorial和文档,但这也不起作用。

我怀疑:

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

发生的错误:

  • 警告150:更改表bazatest2。具有外键(N_REGIONKEY(约束的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-add-controraint-外键的语法和搜索解决方案来解决这个问题,但一直没有找到解决方案。最有可能的是引用外键的列应该是索引或多个错误,但我不知道我应该在代码中更改什么。

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

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

语法错误,请使用此

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

最新更新