无法将外键添加到 table MariaDB/MySQL
Can't add foreign key to table MariaDB/MySQL
我正在为 TPC-H 基准测试在 MariaDB 10.6 数据库中创建 tables。
CREATE TABLE
工作正常,但添加 FOREIGN KEY
失败。
我尝试关注 mariadbtutorial and documentation,但这也不起作用。
我怀疑:
FOREIGN KEY
的语法错误
- 引用外键的列中的数据类型错误。
- 引用外键的列应该是索引
- dbgen 从 TPC-H 基准生成的数据有问题。
发生的错误:
warning 150: alter table bazatest2
.nation
with foreign key (N_REGIONKEY) 约束失败。列 '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 的语法来解决这个问题,昨天一直在搜索解决方案,但没有找到解决方案。
最有可能的是引用外键的列应该是索引,或者多个错误,
但我不知道我的代码应该更改什么。
语法错误,使用这个
ALTER TABLE NATION 添加约束 NATION_FK 外键 (N_REGIONKEY) 引用区域 (R_REGIONKEY);
感谢所有回答,
我将 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 条记录。
我正在为 TPC-H 基准测试在 MariaDB 10.6 数据库中创建 tables。
CREATE TABLE
工作正常,但添加 FOREIGN KEY
失败。
我尝试关注 mariadbtutorial and documentation,但这也不起作用。
我怀疑:
FOREIGN KEY
的语法错误- 引用外键的列中的数据类型错误。
- 引用外键的列应该是索引
- dbgen 从 TPC-H 基准生成的数据有问题。
发生的错误:
warning 150: alter table
bazatest2
.nation
with foreign key (N_REGIONKEY) 约束失败。列 '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 的语法来解决这个问题,昨天一直在搜索解决方案,但没有找到解决方案。 最有可能的是引用外键的列应该是索引,或者多个错误, 但我不知道我的代码应该更改什么。
语法错误,使用这个
ALTER TABLE NATION 添加约束 NATION_FK 外键 (N_REGIONKEY) 引用区域 (R_REGIONKEY);
感谢所有回答, 我将 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 条记录。