Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL复合主键和串行增量?_Sql_Database_Postgresql_Postgresql 9.1 - Fatal编程技术网

PostgreSQL复合主键和串行增量?

PostgreSQL复合主键和串行增量?,sql,database,postgresql,postgresql-9.1,Sql,Database,Postgresql,Postgresql 9.1,我正在尝试创建一个表,如下所示: CREATE TABLE SCHEDULE ( SESSIONID SERIAL, MODULECODE VARCHAR(10), CONSTRAINT SCHEDULE_FOREIGN_KEY FOREIGN KEY (MODULECODE) REFERENCES MODULES (MODULECODE), CONSTRAINT SCHEDULE_PRIMARY_KEY PRIMARY

我正在尝试创建一个表,如下所示:

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));
其思想是,
会话ID
将随每一新行自动递增,但仅限于
模块代码的本地,例如:

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

我相信这就是MySQL中的
AUTO_INCREMENT
功能,但我怀疑PostgreSQL不是这样工作的。在PostgreSQL中,我还能如何实现这一点呢?

正如hourse所说,您不能在数据库中实现这一点。但您可以在“选择”对话框中对这些值进行asign

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

按照@Juan的建议显示数据

select
    row_number() over (
        partition by modulecode order by modulecode
    ) as sessionid, 
    modulecode
from schedule
然后,当用户从某个模块请求某个会话ID时,请执行以下操作:

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
)

MySQL的自动增量不是这样工作的,Postgres的
serial
type也不是这样。如果您在显示数据时生成这些数字,例如使用
行数()
并将
会话ID
保留为一个整体唯一值,则会容易得多。我应该补充一点,会话ID不是唯一值。它仅对模块是唯一的,因此一个模块可以有任意数量的会话,可以在不同的会话之间进行区分。有什么方法可以做到这一点吗?你可以用一个插入前触发器做点什么…?IMSoP,我承认我对SQL非常陌生。我了解触发器是如何工作的,但我不确定从哪里开始构建触发器来实现上述功能?任何想法都会很棒:)@IMSoP问题是更新/删除触发器后也需要,事情可能会变得一团糟。啊,我明白了。这给了我我想要的格式的数据,但是,我想要另一个表,在这个表中,学生可以按照给出的格式为每个模块选择一个特定的
SessionID
。目前,
SessionID
是db中唯一的索引,这意味着学生不能为模块B选择第1或第2节课,而必须选择第4或第5节课。有什么想法吗?抱歉@Jamie4840,你失去了我。也许你可以用一些样本更新你的问题?对于开始,如果将此select放在表函数上会怎么样?用它来代替真正的桌子?但是如果这对你不起作用,我建议你用整个问题来创建一个新问题