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
相关产品推荐
相关产品推荐

