Sqlite 为什么Knex迁移不强制列是唯一的?
我正在使用Knex迁移创建一个SQLite数据库。当我在SQLiteStudio中查看DB时,它并不表示电子邮件列是唯一的。我错过了一个错误吗Sqlite 为什么Knex迁移不强制列是唯一的?,sqlite,knex.js,Sqlite,Knex.js,我正在使用Knex迁移创建一个SQLite数据库。当我在SQLiteStudio中查看DB时,它并不表示电子邮件列是唯一的。我错过了一个错误吗 exports.up = function (knex) { return knex.schema .createTable('users', users => { users.increments(); users.string('email', 128).unique().
exports.up = function (knex) {
return knex.schema
.createTable('users', users => {
users.increments();
users.string('email', 128).unique().notNullable();
users.string('password', 256).notNullable();
})
生成的DDL代码:
CREATE TABLE users (
id INTEGER NOT NULL
PRIMARY KEY AUTOINCREMENT,
email VARCHAR (128) NOT NULL,
password VARCHAR (256) NOT NULL
);
我尝试过但不起作用的替代方案:
-unique()和notNullable()的切换顺序
users.string('email',128).notNullable().unique()
-创建单独的线以添加唯一约束
.createTable('users', users => {
users.increments();
users.string('email', 128).notNullable();
users.string('password', 256).notNullable();
users.unique('email');
})
它是唯一的,您不会在
createtable
语句中看到它。SQLite通过使用UNIQUE
限定符设置UNIQUE
约束。以以下Knex迁移为例:
exports.up = knex =>
knex.schema.debug().createTable("users", t => {
t.increments("id");
t.string("name").unique();
});
注意debug()。以下是调试输出:
[
{
sql: 'create table `users` (`id` integer not null ' +
'primary key autoincrement, `name` ' +
'varchar(255))',
bindings: []
},
{
sql: 'create unique index `users_name_unique` on `users` (`name`)',
bindings: []
}
]
如您所见,将发出第二条语句来创建UNIQUE
约束。如果我们现在查看数据库,我们将看到如下内容:
07:48 $ sqlite3 dev.sqlite3
sqlite> .dump users
BEGIN TRANSACTION;
CREATE TABLE `users` (`id` integer not null primary key autoincrement,
`name` varchar(255));
CREATE UNIQUE INDEX `users_name_unique` on `users` (`name`);
COMMIT;
另外,您可能希望对用户电子邮件的可能长度做更多的研究。请参见作为起点。它是唯一的,您不会在CREATE TABLE
语句中看到它。SQLite通过使用UNIQUE
限定符设置UNIQUE
约束。以以下Knex迁移为例:
exports.up = knex =>
knex.schema.debug().createTable("users", t => {
t.increments("id");
t.string("name").unique();
});
注意debug()。以下是调试输出:
[
{
sql: 'create table `users` (`id` integer not null ' +
'primary key autoincrement, `name` ' +
'varchar(255))',
bindings: []
},
{
sql: 'create unique index `users_name_unique` on `users` (`name`)',
bindings: []
}
]
如您所见,将发出第二条语句来创建UNIQUE
约束。如果我们现在查看数据库,我们将看到如下内容:
07:48 $ sqlite3 dev.sqlite3
sqlite> .dump users
BEGIN TRANSACTION;
CREATE TABLE `users` (`id` integer not null primary key autoincrement,
`name` varchar(255));
CREATE UNIQUE INDEX `users_name_unique` on `users` (`name`);
COMMIT;
另外,您可能希望对用户电子邮件的可能长度做更多的研究。将其视为一个起点