我有一个表Tags
,其中有2列:
name VARCHAR(50)
group_id INT
两者的组合不能重复,因此我使用复合键确保name
和group_id
的组合不能使用两次。
但是由于name
是一个varchar
列,所以它不是查询数据库的很好选择,因此如果我使用一个不是主键的id
列,是一种自动增量,我只能在数据库中搜索一列就可以了吗?
表格将如下所示:
name VARCHAR(50) PRIMARY KEY,
group_id INT PRIMARY KEY
id autoincrement NOT NULL
我以前从未见过,它看起来像一个解决方案,但是在应用此解决方案之前,我真的需要其他观点。
我必须从文件中导入标签,这些标签与我也从文件中导入的另一个表有很多关系,只是为了说明文件结构是这样的:
enterprises |TagGroup1 |TagGroup2 |...TagGroupN Google |t1.1,t1.2 |t2.1,t2.2 |tN.1,tN.2 canonical |t1.1.1 |t2.1,t2.2 |tN.1,tN.2
鉴于此文件,我将解释标签属于一个组,而一个企业具有标签,因此当我导入文件时,我将导入组,然后批量创建标签,它们将导入企业,但是当我需要导入标签和企业之间的关系,如果我需要标签数字ID,这将迫使我一个一个地插入标签,那根本不是一个好主意,但是如果我将名称和组ID作为键,则不再需要等待标签的ID ...
对不起,这已经很久了,我正在努力解释我的问题,但是我不知道我是否成功做到了这一点。
答案 0 :(得分:1)
[…],所以我使用复合键来确保name和group_id的组合不能被使用两次。
您正在描述对约束的需求;根本不需要键。定义表时,您可以指定一个约束,要求多个字段必须一起唯一:
CREATE TABLE tag (
name varchar(50),
group_id int,
UNIQUE (name, group_id) );
通过这种方式,RDBMS强制这些列在每条记录上具有一对唯一的值,而并不意味着它们是检索的关键。
因此,您可以随意提名自己喜欢的任何主键。因为您希望id
字段为主键,所以请这么做:
CREATE TABLE tag (
name varchar(50),
group_id int,
id serial NOT NULL,
UNIQUE (name, group_id),
PRIMARY KEY (id) );