SQLError 19 UNIQUE 约束失败
Posted
技术标签:
【中文标题】SQLError 19 UNIQUE 约束失败【英文标题】:SQLError 19 UNIQUE constraint failed 【发布时间】:2015-07-09 21:10:40 【问题描述】:我在设置我的应用程序、创建本地数据库并简单地插入 first 和 only 用户(已在本地登录)时遇到此错误。请参阅代码中的注释以了解我收到错误消息的位置。
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 约束失败的主要内容,如果未能解决你的问题,请参考以下文章
模型 unique_together 约束 + 无 = 失败?