假设我有一个以id作为主键的学生表,该表包含所有学生的信息。
id | name
---+------
1 | aaron
2 | bob此外,还有一个表,其中id和tid形成一个复合键,它保存每个测试的分数。
id | tid | score
---| --- | ----- 注:不同的学生有不同的考试,不同的数字和没有相关性。tid根本不代表一个特定的测试,但是对于一个学生来说,测试序列号。id=1和id=2,如果tid=1的话,并不意味着它是相同的测试。
产生tid的方法有两种,一种是全局唯一的,每插入一条记录就增加1条。
id | tid | score
-- | --- | -----
1 | 1 | 99
1 | 2 | 98
2 | 3 | 97
2 | 4 | 96另一个在特定id中是唯一的,不同的id可以具有相同的tid值,例如
id | tid | score
-- | --- | -----
1 | 1 | 99
1 | 2 | 98
2 | 1 | 97
2 | 2 | 96 在以前的方法中,id=2的学生可能会根据他的潮水变化猜出整个学校在中间经历了多少次考试。由于每个学生的年龄在全球范围内都有变化,这是我不想要的。当然,我可以考虑不重复地使用随机数或方案。但是我更喜欢一个更紧凑的增量整数来描述它。
对于后者,是否有更有效和更简单的方法来实现它?
发布于 2022-07-23 15:30:53
备选案文1。
create table student(id integer PRIMARY KEY, name varchar);
create table test(tid integer PRIMARY KEY, name varchar, test_date date);
create table test_score(sid integer, tid integer references test, score integer, PRIMARY KEY(sid, tid);更新
备选案文2。
创建一个BEFORE INSERT触发器,该触发器使用的函数大致可以:
CREATE OR REPLACE FUNCTION tid_incr()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
DECLARE
max_ct integer;
BEGIN
SELECT INTO max_ct max(tid) FROM score WHERE id = NEW.id;
NEW.tid = max_ct + 1;
RETURN NEW;
END;
$function$https://stackoverflow.com/questions/73091887
复制相似问题