Slick 3.1.1 没有创建唯一约束
Slick 3.1.1 not creating unique constraint
我有一个简单的用户 table,其中 id
设置为自动递增,并且 username
设置为在 table 中唯一。
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)
) 创建 table 时,不会在数据库
上创建唯一索引 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`)
数据库查询用户索引Table
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 函数时是否缺少创建唯一约束的内容?
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)"))
我有一个简单的用户 table,其中 id
设置为自动递增,并且 username
设置为在 table 中唯一。
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)
) 创建 table 时,不会在数据库
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`)
数据库查询用户索引Table
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 函数时是否缺少创建唯一约束的内容?
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)"))