SQLError 19 UNIQUE 约束失败

Posted

技术标签:

【中文标题】SQLError 19 UNIQUE 约束失败【英文标题】:SQLError 19 UNIQUE constraint failed 【发布时间】:2015-07-09 21:10:40 【问题描述】:

我在设置我的应用程序、创建本地数据库并简单地插入 firstonly 用户(已在本地登录)时遇到此错误。请参阅代码中的注释以了解我收到错误消息的位置。

angular.module("greenApp")
.service("dbService",['$q', function($q)

    var db;
    var promise = function()
        var deferred = $q.defer();

        db = window.openDatabase('greenDB', '1.0', 'Green Database', 2*1024*1024);

        db.transaction(function(tx)
            tx.executeSql("CREATE TABLE IF NOT EXISTS user (user TEXT PRIMARY KEY) ")
        , function(err)
            alert('Something went wrong... Error: DATABASE INIT ' + err);
        , function(scc)
            deferred.resolve();
        )

        return deferred.promise;
    
    promise();

    var query = function(sql, args) 
        var deferred = $q.defer();

        db.transaction(function(tx) 
            tx.executeSql(sql, args, function(tx, results) 
                deferred.resolve(results);
            );
        , function(err) 
            deferred.reject(err);
        );

        return deferred.promise;
    ;

    var insert_into = function(args) 
        var queryPromise = query("INSERT INTO user (user) VALUES (?)", args);
        console.log("in insert_into", queryPromise) // Error message comes here
        return queryPromise;
    ;

    return 
        promise: promise,
        insert_into: insert_into,
    ;
]);

args 只是 ["user-name-string"],我收到一条错误消息:

"由于约束失败,无法执行语句(19 UNIQUE 约束失败:user.user)

任何想法可能会发生什么?完全相同的代码在我刚刚移植到 Ionic 的最近的纯 cordova 项目中运行和工作。

【问题讨论】:

你能不能显示你正在使用的 dbms 的表结构 你想在表格中插入相同的文本吗?你能举个例子吗? 我会直接在您的 insert_into 方法中抛出一个 console.log 语句并仔细检查以确保 args 是您所期望的,而不是例如 null。 谢谢,但我已经做到了,args 符合预期,并且与问题中所述完全一致。 user 列名吗? 【参考方案1】:

看起来您在代码中插入了两次...这里

var insert_into = function(args) 

    var queryPromise = query("INSERT INTO user (user) VALUES (?)", args);
    console.log("in insert_into", queryPromise) // Error message comes here
    return query("INSERT INTO user (user) VALUES (?)", args); <-- you did a query above, now you do it again?!?
;

【讨论】:

是的,对不起,写得真的很糟糕。虽然错误出现在第二个查询之上..再次编辑问题仍然是同样的错误。 如果您在将代码发布到此处之前重写代码,我们可能很难找到困扰您的问题。 是的 - 但谁知道你还重写了什么?重写东西会引入新的错误来源。这就是我的观点。【参考方案2】:

当您退出应用程序时,sqlite 数据库仍然存在,因此每次启动应用程序时它都会尝试执行插入操作。 (我猜它在第一次启动时有效,第二次出现错误)。

当您使用 CREATE TABLE IF NOT EXISTS 时,应用不会在创建表时失败,而是在第一次插入时失败。

您可以使用 pragma user_version 来读取/写入数据库的版本,因此知道在哪种情况下您必须创建表/插入值,或者数据库是否已经准备就绪。

【讨论】:

以上是关于SQLError 19 UNIQUE 约束失败的主要内容,如果未能解决你的问题,请参考以下文章

IOS Coredata UNIQUE 约束失败:

模型 unique_together 约束 + 无 = 失败?

UNIQUE 约束失败:ZTEMPORADA.Z_PK

Django:如何处理CreateView中针对UNIQUE约束的错误消息失败

mysql 中UNIQUE KEY 到底是约束还是索引?

SQL 错误:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败