【问题标题】:PostgreSQL Composite Primary Key and Serial increment?PostgreSQL 复合主键和序列增量?
【发布时间】:2015-12-03 19:27:43
【问题描述】:

我正在尝试按如下方式创建表:

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,例如:

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

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

【问题讨论】:

  • MySQL 的自动增量不能这样工作,Postgres 的serial 类型也不能。如果您在显示数据时生成这些数字会容易得多,例如使用 row_number() 并保持 sessionid 作为整体唯一值。
  • 我应该补充一点,会话 ID 并不是一个唯一值。它仅对模块是唯一的,因此一个模块可以有任意数量的可以区分的会话。有什么方法可以实现吗?
  • 你也许可以用 BEFORE INSERT 触发器做点什么...?
  • IMSoP,我承认我对 SQL 还是很陌生。我了解触发器的工作原理,但我不确定从哪里开始构建触发器以实现上述功能?任何想法都会很棒:)
  • @IMSoP 问题是更新/删除触发器后也需要,事情可能会变得混乱。

标签: sql database postgresql postgresql-9.1


【解决方案1】:

按照@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
)

【讨论】:

    【解决方案2】:

    正如小时所说,你不能在你的数据库上做到这一点。但是您可以在选择中指定这些值

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

    【讨论】:

    • 啊,我明白了。这为我提供了我想要的格式的数据,但是,我想要另一个表格,学生可以在其中为每个模块选择一个特定的SessionID,并采用这种格式。目前,SessionID 是数据库中的唯一索引,这意味着学生无法为模块 B 选择会话 1 或 2,而必须选择会话 4 或 5。有什么想法吗?
    • 对不起@Jamie4840,你弄丢了我。也许如果你用一些样本更新你的问题?首先,如果您将此选择放在表函数上怎么办?并用它代替真正的桌子?但是,如果这对您不起作用,我建议您针对整个问题创建一个新问题
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多