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

p8ekf7hl  于 2022-11-08  发布在  Mysql
关注(0)|答案(2)|浏览(152)

我正在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,但出现了不同得错误:
  • 错误1452,当我尝试将UNSIGNED添加到应该引用外键列中BIGINT

包含创建的文件的一部分:

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 constraint foreign key的语法来解决这个问题,并一直在搜索解决方案,但没有找到解决方案。最有可能的是引用外键的列应该是索引,或者多个错误,但我不知道我应该在代码中改变什么。

rsl1atfo

rsl1atfo1#

谢谢大家的回答,我在BIGINT中添加了UNSIGNED,但这不是我的问题的主要来源。问题是我从主键值从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条记录。
6kkfgxo0

6kkfgxo02#

语法错误,请使用

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

相关问题