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年前
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;
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;
最佳回答
热门帖子
- 12025-12-01浏览数:182762
- 22023-05-09浏览数:25056
- 42023-09-25浏览数:18525
- 52020-05-11浏览数:17528
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);