Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 为什么Knex迁移不强制列是唯一的?_Sqlite_Knex.js - Fatal编程技术网

Sqlite 为什么Knex迁移不强制列是唯一的?

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().

我正在使用Knex迁移创建一个SQLite数据库。当我在SQLiteStudio中查看DB时,它并不表示电子邮件列是唯一的。我错过了一个错误吗

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;
另外,您可能希望对用户电子邮件的可能长度做更多的研究。将其视为一个起点