GBase 8c
运维管理
问答

SQL建表带有外键的情况下,有多个字段怎么办?

发表于2025-02-17 11:51:3198次浏览3个评论

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

【GBase版本】:GBase8c v53.0

【操作系统】:CentOS 7.8

【CPU】:

【问题描述】*: SQL建表带有外键的情况下,有多个字段怎么办?

1. CREATE TABLE roles(
id serial primary key not null,


description varchar(255) null
);
2. CREATE TABLE users(
id serial primary key not null,
description varchar(255) null
);
然后再执行这个
CREATE TABLE user_roles(
id serial primary key not null,

userid integer not null,

roleid integer,
foreign key (userid) references users (id) on delete cascade,
foreign key (roleid) references roles (id) on delete cascade
) DISTRIBUTE BY HASH(userid, roleid)//会报错;

评论

登录后才可以发表评论
GBase用户11993发表于 1年前
在分布式场景下,对分布键、主键和外键有如下限制:
1.分布键只能为1列,user_roles表的分布键制定了2列
2.主键必须要包含外键,所以设置了id为主键,那分布键就必须为id,除非使用联合组建,比如分布键使用userid,主键使用userid+id的联合主键。
3.外键同样需要有包含分布键,因为外键约束必须要成立,所以外键只能作为分布键。

解决:
1.id作为主键的情况下,分布键使用id,但是两个外键就需要取消。
CREATE TABLE user_roles(
id serial primary key not null,
userid integer not null,
roleid integer
) DISTRIBUTE BY HASH(id);
2.id的主键取消,使用userid或者roleid作为外键(只能保留一个外键),这个时候分布键必须和外键使用相同列,主键使用id和分布键作为联合主键。
CREATE TABLE user_roles(
id serial not null,
userid integer not null,
roleid integer,
foreign key (userid) references users (id) on delete cascade
) DISTRIBUTE BY HASH(userid);
ALTER TABLE user_roles ADD PRIMARY KEY (id,userid);
GBase用户26303发表于 1年前
@GBase用户11993:意思是只能有1个外键?不能有两个外键?那需要2个外键的话怎么办呢?
小忘发表于 1年前
@GBase用户26303:表数据比较多,一定需要分布表,建议把外键去掉, 分布式数据分布和外键约束容易冲突, 数据量少的话可以创建成复制表CREATE TABLE roles6(
id serial primary key not null,
description varchar(255) null
)DISTRIBUTE BY REPLICATION;

CREATE TABLE users6(
id serial primary key not null,
description varchar(255) null
) DISTRIBUTE BY REPLICATION;

CREATE TABLE user_roles6(
id serial primary key not null,
userid integer not null,
roleid integer,
foreign key (userid) references users6 (id) on delete cascade,
foreign key (roleid) references roles6 (id) on delete cascade
) DISTRIBUTE BY REPLICATION;
最佳回答