【问题标题】:Slick 3.1.1 not creating unique constraintSlick 3.1.1 未创建唯一约束
【发布时间】:2016-06-04 18:29:57
【问题描述】:

我有一个简单的用户表,id 设置为自动递增,username 在表中设置为唯一。

class Users (tag: Tag) extends Table[User](tag, "Users") {

  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def username = column[String]("username", NotNull)
  def email = column[String]("email")
  def passwordHash = column[String]("password_hash")
  def createdAt = column[Long]("created_at")
  def updatedAt = column[Long]("updated_at")
  def lastLoggedInAt = column[Long]("last_logged_in_at")

  override def * = (id.?, username, email, passwordHash, createdAt, updatedAt, lastLoggedInAt) <> (User.tupled, User.unapply)

  def idxUsername = index("idx_username", username, unique = true)
}

但是当使用 slick (db.run(users.schema.create)) 创建表时,不会在数据库上创建唯一索引 idx_username

这里是架构users.schema.createStatements.foreach(println)的创建语句:

create table `Users` (`id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,`username` TEXT NOT NULL,`email` TEXT NOT NULL,`password_hash` TEXT NOT NULL,`created_at` BIGINT NOT NULL,`updated_at` BIGINT NOT NULL,`last_logged_in_at` BIGINT NOT NULL)
create unique index `idx_username` on `Users` (`username`,`email`)

数据库查询用户表上的索引

mysql> SHOW INDEX FROM Users;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| users |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

我在执行 DDL 函数时是否遗漏了一些东西来创建唯一约束?

【问题讨论】:

    标签: mysql scala database-schema slick-3.0


    【解决方案1】:

    TEXT 列不能用作UNIQUE。如果你尝试,

    db.run(users.schema.create).onFailure{
      case x => println("error " + x)
    }
    

    它会打印出来,

    error com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: BLOB/TEXT column 'username' used in key specification without a key length

    作为一种变通方法,您可以指定类型和长度,

    def username = column[String]("username", O.SqlType("VARCHAR(65535)"))
    

    【讨论】:

    • 谢谢。我不知道我不能在 MySQL 的文本列上拥有唯一索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2015-10-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多