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放在表函数上会怎么样?用它来代替真正的桌子?但是如果这对你不起作用,我建议你用整个问题来创建一个新问题