我有一个关于SQL Server性能的问题.
假设我有一个表persons有以下栏目:id,name,surname.
现在,我想在此表中插入一个新行.规则如下:
如果id表中没有,则插入行.
如果id存在,则更新.
我这里有两个解决方案:
第一:
update persons
set id=@p_id, name=@p_name, surname=@p_surname
where id=@p_id
if @@ROWCOUNT = 0
insert into persons(id, name, surname)
values (@p_id, @p_name, @p_surname)
Run Code Online (Sandbox Code Playgroud)
第二:
if exists (select id from persons where id = @p_id)
update persons
set id=@p_id, name=@p_name, surname=@p_surname
where id=@p_id
else
insert into persons(id, name, surname)
values (@p_id, @p_name, @p_surname)
Run Code Online (Sandbox Code Playgroud)
什么是更好的方法?看起来在第二个选择中,要更新一行,它必须被搜索两次,而在第一个选项中 - 只需一次.这个问题还有其他解决方案吗?我正在使用MS SQL 2000.
我有一个表格列record_id(自动公司)sender,sent_time和status.
如果没有特定发件人的任何记录,例如"sender1",我必须插入新记录,否则我必须更新属于"user1"的现有记录.
因此,如果没有任何记录存储,我会执行
# record_id is AUTO_INCREMENT field
INSERT INTO messages (sender, sent_time, status)
VALUES (@sender, time, @status)
Run Code Online (Sandbox Code Playgroud)
否则我会执行UPDATE语句.
无论如何..有没有人知道如何组合这两个语句,以便插入一个新的记录,如果没有任何记录,其中字段发送者值是"user1"否则更新现有的记录?
所以我有两张这样的桌子......
ext_words
-------------
| id | word |
-------------
| 1 | this |
-------------
| 2 | that |
-------------
| 3 | this |
-------------
ext_words_count
---------------------
| id | word | count |
---------------------
| 1 | this | 2 |
---------------------
| 2 | that | 1 |
---------------------
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个触发器,它将:
ext_words_count.count时ext_words.word更新.使事情进一步复杂化,
ext_words.word在更新ext_words_count时不存在ext_words,我想将其插入ext_words_count并设置count为1.我一直在寻找类似的问题:
1. 使用自动增量字段插入触发器之前/之后,以及
2. 使用触发器更新另一个数据库中的表来
尝试组合2.这是我到目前为止所拥有的:
DELIMITER $$ …Run Code Online (Sandbox Code Playgroud) 目前,我使用以下语句在Android设备上的SQLite数据库中创建表.
CREATE TABLE IF NOT EXISTS 'locations' (
'_id' INTEGER PRIMARY KEY AUTOINCREMENT, 'name' TEXT,
'latitude' REAL, 'longitude' REAL,
UNIQUE ( 'latitude', 'longitude' )
ON CONFLICT REPLACE );
Run Code Online (Sandbox Code Playgroud)
最后的conflict-clause导致在完成具有相同坐标的新插入时删除行.在SQLite的文档包含有关冲突条款的进一步信息.
相反,我想保留前面的行,只是更新他们的列.在Android/SQLite环境中执行此操作的最有效方法是什么?
CREATE TABLE声明中的冲突条款.INSERT触发器.ContentProvider#insert.我认为在数据库中处理此类冲突更具性能.此外,我发现很难重写该ContentProvider#insert方法以考虑插入更新方案.这是insert方法的代码:
public Uri insert(Uri uri, ContentValues values) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
long id = db.insert(DatabaseProperties.TABLE_NAME, null, values);
return ContentUris.withAppendedId(uri, id);
}
Run Code Online (Sandbox Code Playgroud)
当数据从后端到达时,我所做的就是按如下方式插入数据.
getContentResolver.insert(CustomContract.Locations.CONTENT_URI, …Run Code Online (Sandbox Code Playgroud) 我正在使用Java连接到MySQL数据库.我正在尝试将数据插入或更新到数据库中.
尽管我非常确定插入是成功的,但它返回false.
根据"execute"API,返回值为"如果第一个结果是ResultSet对象,则为true;如果是更新计数,则为false"或"没有结果".
如何确定插入或更新是否成功?
public boolean insertSelections(String selection, String name){
String sql ="INSERT INTO WORKREPORT VALUES (?,?,?,?,?)";
boolean action = false;
try {
PreparedStatement stmt = conn.prepareStatement(sql);
SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyy?MM?dd hh:mm:ss");
String formatDate = dateFormat.format(new java.util.Date(System.currentTimeMillis()));
java.util.Date mDate = dateFormat.parse(formatDate);
java.sql.Timestamp timeStamp = new java.sql.Timestamp(System.currentTimeMillis());
// Date time= new Date(mDate.getTime());
stmt.setInt(1, Integer.parseInt(getNumberByName(name).trim()));
stmt.setString(2, name);
// stmt.setDate(3, time);
stmt.setTimestamp(3, timeStamp);
stmt.setString(4, selection);
stmt.setString(5, "N/A");
action = stmt.execute();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} …Run Code Online (Sandbox Code Playgroud) 我的应用程序很少,允许用户对视频进行评级.
用户只能评价一次.所以我已经定义了模型的唯一性.
但他应该能够改变他的比率.所以save()应该更新重复键
class VideoRate(models.Model):
"""Users can Rate each Video on the criterias defined for the topic"""
user = models.ForeignKey(User)
video = models.ForeignKey(VideoFile)
crit = models.ForeignKey(VideoCrit)
rate = models.DecimalField(max_digits=2, decimal_places=1, choices=RATE_CHOICES)
class Meta:
unique_together = (('user', 'video', 'crit'),)
verbose_name = 'Video Rating'
Run Code Online (Sandbox Code Playgroud)
如果我
rate = VideoRate(user_id=1, video_id=1, crit_id=1, rate=2)
rate.save()
Run Code Online (Sandbox Code Playgroud)
它正在保存评级,但如果我
rate = VideoRate(user_id=1, video_id=1, crit_id=1, rate=3)
rate.save()
Run Code Online (Sandbox Code Playgroud)
我得到了正常的错误
IntegrityError: (1062, "Duplicate entry '1-1-1' for key 'user_id'")
Run Code Online (Sandbox Code Playgroud)
即使我使用force_update=True(因为仅基于主键)
有没有办法更新评级,如果它已经存在而不必检查之前的数据?
这基本上是一个嵌套的表单问题,尽管只有一个属于父模型的字段.我的数据输入表单收集模型的数据 - 但是我还需要收集一个实际进入将使用详细记录创建的父记录的数据元素/值(UserID).
AFAIK Rails希望每个表单字段都映射到一个模型,我需要创建一个我将单独使用的未绑定数据输入字段.
如何覆盖此默认行为并创建"自由格式/未绑定字段"?
TIA,BC
我正在使用H2.我想在表中插入一个值(如果它不存在).我创建表:
CREATE TABLE IF NOT EXISTS $types
(type VARCHAR(15) NOT NULL UNIQUE);
Run Code Online (Sandbox Code Playgroud)
我想做点什么
REPLACE INTO types (type) values ('type1');
Run Code Online (Sandbox Code Playgroud)
我发现了一个关于替换的例子,显然适用于MySQL,但我使用的是h2.但是当我从我的h2控制台运行时出现错误:
Syntax error in SQL statement "REPLACE[*] INTO TYPES (TYPE) VALUES ('expense') "; expected "ROLLBACK, REVOKE, RUNSCRIPT, RELEASE, {"; SQL statement:
REPLACE INTO types (type) values ('expense') [42001-170] 42001/42001
Run Code Online (Sandbox Code Playgroud)
我也试过了
INSERT IGNORE INTO types (type) values ('expense');
Run Code Online (Sandbox Code Playgroud)
和
INSERT INTO types (type) values ('expense') ON DUPLICATE KEY UPDATE type=type;
Run Code Online (Sandbox Code Playgroud)
我不在乎新插件是否会覆盖旧数据,或者它是否只是不执行新插入.有没有办法用h2数据库做到这一点?
我想使用codeigniter活动记录实现SQL语句.
UPDATE tags SET usage = usage+1 WHERE tag="java";
Run Code Online (Sandbox Code Playgroud)
如何使用Codeigniter活动记录实现此目的?
问候
核心数据驱动应用程序的常见方案是从后备存储中获取唯一对象.如果存在具有特定唯一属性的对象,则返回该对象,如果它不返回新创建的对象.我发现自己一遍又一遍地写同样的东西,所以我用一种方便的方法把它包起来.但这似乎是微不足道的,我在这里重新发明轮子吗?有没有更简单,开箱即用的方法来实现这一目标?
干杯,
EP
+(id)uniqueEntityfForName:(NSString *)name
withValue:(id)value
forKey:(NSString *)key
inManagedObjectContext:(NSManagedObjectContext *)context {
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
request.entity = [NSEntityDescription entityForName:name inManagedObjectContext:context];
request.predicate = [NSPredicate predicateWithFormat:[key stringByAppendingString:@" == %@"], value];
NSArray *result = [context executeFetchRequest:request error:nil];
id entity = [result lastObject];
if (entity == nil) {
entity = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context];
[entity setValue:value forKey:key];
} else {
entity = [result lastObject];
}
return entity;
}
Run Code Online (Sandbox Code Playgroud)
我使用这样的方法:
SomeEntity *entity = [CDUtils uniqueEntityfForName:@"SomeEntity" withValue:@"foo" forKey:@"bar" inManagedObjectContext:context];
Run Code Online (Sandbox Code Playgroud) insert-update ×10
mysql ×3
insert ×2
activerecord ×1
android ×1
codeigniter ×1
core-data ×1
database ×1
django ×1
h2 ×1
java ×1
jdbc ×1
nested-forms ×1
objective-c ×1
save ×1
sql ×1
sql-server ×1
sqlite ×1
t-sql ×1
triggers ×1
unique ×1