PostgreSQL复合主键和序列自增?

10

我正试图创建一个如下所示的表格:

CREATE TABLE SCHEDULE (
 SESSIONID                  SERIAL,
 MODULECODE                 VARCHAR(10),
 CONSTRAINT SCHEDULE_FOREIGN_KEY FOREIGN KEY (MODULECODE) REFERENCES MODULES (MODULECODE),
 CONSTRAINT SCHEDULE_PRIMARY_KEY PRIMARY KEY (SESSIONID, MODULECODE));

这个想法是让SESSION ID在每一行自动递增,但只在MODULECODE本地生效,例如:

这个想法是让SESSION ID在每一行自动递增,但只在MODULECODE本地生效,例如:

----------------------
|SESSIONID|MODULECODE|
|---------|----------|
|    1    |    A     |
|    2    |    A     |
|    3    |    A     |
|    1    |    B     |
|    2    |    B     |
|    1    |    C     |
|    2    |    C     |
|--------------------|

我相信MySQL中AUTO_INCREMENT的功能是这样实现的,但我怀疑PostgreSQL不是这样工作的。那么在PostgreSQL中该如何实现同样的功能呢?


1
MySQL的自动增量不像那样工作,Postgres的“serial”类型也不是这样。如果您在显示数据时生成这些数字(例如使用row_number()),并将sessionid保留为总体唯一值,那么将会更容易。 - user330315
我应该补充说明,会话ID并不是一个唯一值。它仅在模块内是唯一的,因此模块可以拥有任意数量的会话,并且可以进行区分。我是否有办法实现这个? - Hexodus
2
你或许可以使用"BEFORE INSERT"触发器来实现某些操作...? - IMSoP
IMSoP,我承认我对SQL还很陌生。我知道触发器是如何工作的,但我不确定该从哪里开始构建一个以实现上述功能的触发器?有什么好的想法吗? :) - Hexodus
2
@IMSoP,问题在于还需要更新/删除触发器,事情可能会变得混乱。 - Juan Carlos Oropeza
显示剩余2条评论
2个回答

2

按照@Juan的建议显示数据

select
    row_number() over (
        partition by modulecode order by modulecode
    ) as sessionid, 
    modulecode
from schedule

当用户请求来自某个模块的特定sessionid时,请执行以下操作:
select *
from schedule
where sessionid = (
    select sessionid
    from (
        select
            sessionid,
            row_number() over (order by sessionid) as module_sessionid
        from schedule
        where modulecode = 'B'
    ) s
    where module_sessionid = 2
)

1

作为hourse所说,您无法在数据库中完成此操作。但是您可以在选择中分配这些值。

 SELECT row_number() over (partition by MODULECODE order by MODULECODE) as SESSIONID, 
        MODULECODE
 FROM YourTable

啊,我明白了。这样可以按照我想要的格式提供数据,但是我还想要另一个表格,让学生能够为每个模块选择一个特定的 "SessionID"。目前,“SessionID”在数据库中是一个唯一索引,这意味着学生不能为模块B选择会话1或2,而必须选择4或5。有什么想法吗? - Hexodus
抱歉@Jamie4840,我不明白你的意思。也许如果你在问题中提供一些示例会更好?首先,如果你将这个select语句放在一个表函数中并使用它代替真实的表会怎样呢?但是如果这对你没有用,我建议你创建一个新的问题并陈述整个问题。 - Juan Carlos Oropeza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接