复合键+自动增量字段

时间:2019-03-07 01:45:12

标签: sql database postgresql

我有一个表Tags,其中有2列:

name VARCHAR(50)
group_id INT

两者的组合不能重复,因此我使用复合键确保namegroup_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 ...

对不起,这已经很久了,我正在努力解释我的问题,但是我不知道我是否成功做到了这一点。

1 个答案:

答案 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) );