多外键场景下如何设置主键列名?查询为何看不到自定义主键列
问题原因与解决方法
你当前的写法是给主键约束命名为ENROLL_ID,不是创建一个同名的表列。数据库里的约束名属于元数据(用来标识约束,方便后续修改/删除),不会作为实际字段出现在表结构中,所以执行select *时看不到这个“列”。
对应解决方案
如果只是需要给复合主键约束起个名字(方便管理):
你的写法本身是正确的,要验证约束是否存在,可以用数据库对应的系统查询语句:- MySQL:
SHOW CREATE TABLE teach_enroll;(查看建表语句,会显示约束名) - PostgreSQL:
SELECT conname FROM pg_constraint WHERE conrelid = 'teach_enroll'::regclass; - SQL Server:
SELECT name FROM sys.key_constraints WHERE parent_object_id = OBJECT_ID('teach_enroll');
- MySQL:
如果确实需要一个名为
ENROLL_ID的列作为主键:
得单独定义该列,同时可以给原复合字段加唯一约束保证唯一性,示例代码:create table teach_enroll( ENROLL_ID varchar(64) not null primary key, instructor_id varchar(64) not null, class_id varchar(64) not null, course_id varchar(64) not null, student_id varchar(64) not null, foreign key (instructor_id) references instructor(id), foreign key (class_id) references class(id), foreign key(course_id) references course_type(id), foreign key (student_id) references student(id), CONSTRAINT unique_enroll_info UNIQUE (class_id,course_id,student_id) );如果想生成一个包含复合主键组合值的
ENROLL_ID列(仅作显示用):
可以用数据库的生成列功能,自动拼接复合字段的值,示例(以MySQL为例):create table teach_enroll( instructor_id varchar(64) not null, class_id varchar(64) not null, course_id varchar(64) not null, student_id varchar(64) not null, ENROLL_ID varchar(192) GENERATED ALWAYS AS (CONCAT(class_id, '-', course_id, '-', student_id)) STORED, foreign key (instructor_id) references instructor(id), foreign key (class_id) references class(id), foreign key(course_id) references course_type(id), foreign key (student_id) references student(id), CONSTRAINT pk_enroll primary key (class_id,course_id,student_id) );这种方式下
ENROLL_ID会自动生成,查询时能看到,但主键依然是原来的复合列,避免冗余。
内容的提问来源于stack exchange,提问作者captain anas
相关产品推荐
相关产品推荐

