You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Slick中如何创建复合主键?按示例操作后主键未生效

解决Slick复合主键未生效的问题

我来帮你搞定这个复合主键不生效的问题!你贴的代码片段本身逻辑是对的,但可能是表定义的完整性或者执行环节出了问题,咱们一步步排查:

首先,先确认你的表类是不是完整定义了投影(也就是*方法),这是Slick表定义里很关键的部分,完整的表定义应该是这样的:

class Notifications(tag: Tag) extends Table[(String, String, String)](tag, "notifications") {
  def a = column[String]("a")
  def b = column[String]("b")
  def c = column[String]("c")
  
  // 定义复合主键
  def pk = primaryKey("pk_notifications", (a, b, c))
  
  // 必须定义表的投影,包含所有列
  override def * = (a, b, c)
}

接下来,排查几个常见的坑:

  • 有没有真正执行DDL创建表?
    你定义了表结构后,需要主动执行DDL语句才能在数据库里创建带主键的表,比如:

    val db = Database.forConfig("yourDbConfig")
    val notificationsTable = TableQuery[Notifications]
    // 执行创建表操作
    db.run(notificationsTable.schema.create)
    

    如果表已经提前存在,Slick默认不会修改现有表结构,这时候你需要手动执行ALTER语句添加主键:

    ALTER TABLE notifications ADD PRIMARY KEY (a, b, c);
    
  • 检查生成的DDL是否正确
    可以打印出生成的SQL语句,确认主键是否被正确包含:

    println(notificationsTable.schema.create.statements.mkString("\n"))
    

    正常情况下,输出的CREATE TABLE语句里应该包含PRIMARY KEY (a, b, c)。

  • 数据库兼容性问题
    比如MySQL的InnoDB引擎对主键总长度有限制(默认是767字节),如果你的三个String列长度加起来超过这个值,主键会创建失败但可能不会抛出明显错误。可以检查数据库的错误日志,或者缩短列的长度试试。

最后,执行DESCRIBE notifications再确认,应该就能看到主键生效啦!

内容的提问来源于stack exchange,提问作者Mahesh Chand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:03:38