我想在数据库表中添加一行,但如果存在具有相同唯一键的行,我想更新该行.
例如,
insert into table (id, name, age) values(1, "A", 19)
Run Code Online (Sandbox Code Playgroud)
假设唯一的密钥是id,在我的数据库中有一行id = 1.在这种情况下,我想用这些值更新该行.通常这会产生错误.如果我使用insert IGNORE它将忽略错误,但它仍然不会更新.
假设一个表结构MyTable(KEY, datafield1, datafield2...).
通常我想要更新现有记录,或者如果新记录不存在则插入新记录.
实质上:
IF (key exists)
run update command
ELSE
run insert command
Run Code Online (Sandbox Code Playgroud)
写这个的最佳表现方式是什么?
http://en.wikipedia.org/wiki/Upsert
在SQLite中有没有一些我没想到的聪明方法?
基本上,如果记录存在,我想更新四列中的三列,如果它不存在,我想用第四列的默认(NUL)值插入记录.
ID是主键,因此UPSERT只会有一条记录.
(我试图避免SELECT的开销,以确定我是否需要更新或插入显然)
建议?
我无法在SQLite网站上确认SQL CREATE的语法.我还没有构建一个演示来测试它,但它似乎不支持..
如果是,我有三列,所以它实际上看起来像:
CREATE TABLE table1(
id INTEGER PRIMARY KEY ON CONFLICT REPLACE,
Blob1 BLOB ON CONFLICT REPLACE,
Blob2 BLOB ON CONFLICT REPLACE,
Blob3 BLOB
);
Run Code Online (Sandbox Code Playgroud)
但是前两个blob不会引起冲突,只有ID会因此我asusme Blob1和Blob2不会被替换(根据需要)
绑定数据时SQLite中的UPDATE是一个完整的事务,这意味着每个要更新的发送行都需要:Prepare/Bind/Step/Finalize语句,与允许使用重置函数的INSERT不同
语句对象的生命周期如下:
更新我猜测与INSERT相比速度慢,但它与使用主键的SELECT相比如何呢?
也许我应该使用select来读取第4列(Blob3),然后使用REPLACE编写一条新记录,将原始的第4列与前3列的新数据混合在一起?
我找到了一些经典的"将来"的解决方案,如果它已经存在,我将如何插入新记录或更新一个记录,但我无法让它们在SQLite中工作.
我有一个表定义如下:
CREATE TABLE Book
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Name VARCHAR(60) UNIQUE,
TypeID INTEGER,
Level INTEGER,
Seen INTEGER
Run Code Online (Sandbox Code Playgroud)
我想要做的是添加一个具有唯一名称的记录.如果名称已存在,我想修改字段.
有人可以告诉我该怎么做?
我正在寻找一种方法来使用Swift代码访问我的应用程序中的SQLite数据库.
我知道我可以在Objective C中使用SQLite Wrapper并使用桥接头,但我宁愿能够完全在Swift中完成这个项目.有没有办法做到这一点,如果是这样,有人可以指向我的参考,显示如何提交查询,检索行等?
我需要对SQLite数据库执行UPSERT/INSERT或UPDATE.
在许多情况下,命令INSERT OR REPLACE可能很有用.但是如果你想因为外键而使你的id保持自动增量,那么它不起作用,因为它删除了行,创建了一个新行,因此这个新行有一个新的ID.
这将是表格:
播放器 - (id上的主键,user_name唯一)
| id | user_name | age |
------------------------------
| 1982 | johnny | 23 |
| 1983 | steven | 29 |
| 1984 | pepee | 40 |
Run Code Online (Sandbox Code Playgroud) 我想知道如何使用一个语句在SQL Server中使用UPSERT或换句话说UPDATE if records exists Else enter new record操作?
这个例子显示了在Oracle中实现这一目标的方式在这里
,但它使用Dual表,它这不存在SQL Server.
那么,任何SQL Server替代品(没有存储过程)好吗?
我在下面有一个SQL插入,工作正常,但是我想检查DATE = xxxx,NAME = xxxx和JOB = xxx,如果它们存在则更新HOURS,否则插入新行.这可能用SQL吗?
"INSERT INTO TABLE (NAME, DATE, JOB, HOURS) VALUES ('BOB', '12/01/01', 'PM','30');
Run Code Online (Sandbox Code Playgroud)
尝试使用相同结果的下面的OR REPLACE,每次都会添加一个新行.
add_time = conn.prepareStatement("INSERT OR REPLACE INTO RESOURCE (NAME, DATE, JOB, HOURS) VALUES ('"+name+"', '" + date + "', '"+job+"','"+hours+"');");
Run Code Online (Sandbox Code Playgroud)
例如:
如果以下是在DB中,并且John想要更新他的小时数,那么它将检查名称,日期,作业是否与尝试插入的值相同以及它们是否仅仅是更新HOURS.否则,如果它们中没有一个存在(John可能有几个小时记录另一个DATE或JOB)插入一个新行.
其他人也会在下面的同一个数据库中记录他们的小时和不同的角色.
约翰| 12/12/2012 | 清洁剂| 20约翰| 12/12/2012 | 首席执行官 10吉姆| 12/10/2011 | 清洁剂| 五