Upsert(替换)
(使用主键作为流水线)
有没有办法在 SQL Server 2005 中批量更新插入?类似于 2008 年的 MERGE 的东西将是完美的。我有一张桌子作为临时工作区,需要在会话完成时与主表协调。在 2008 年,merge 对此会做得很好,但我见过的唯一 2005 年方法是针对单个 upserts,而不是批量。想法?
我有一个人的哈希,每个人都拥有一系列的价值观.
如果散列中不存在某个人,我想创建一个带有值的新数组,并将其添加到散列中.如果它们存在,我想找到相应的数组并将项添加到它.
对于这样一个简单的操作(基本上是upsert),这段代码看起来有点啰嗦.有没有更惯用的写作方式?
people = {}
person_values = people.fetch(name, [])
person_values << item
people[name] = person_values
Run Code Online (Sandbox Code Playgroud) 我想upsert(update or insert) a list of record,其实我知道mongodbbulk从mongodb3.0开始就支持操作了。
我想知道是否mongoengine支持bulk upsert operation在mongoengine (0.10.0)。
如果没有,我想知道如何upsert记录列表,我知道mongoengine支持这样的insert批处理:
class User(Document):
username = StringField(required=True)
password = StringFiedl(required=True)
meta = {'db_alias': 'user_info', 'collection': 'user',
'indexes': [{'fields': ['username'], 'unique': True}]
}
def save_users(self, users):
Users.objects.insert(users) # raise mongoengine.errors.NotUniqueError
Run Code Online (Sandbox Code Playgroud) 根据有关 Tombstone 的问题,为什么 upserts 不创建墓碑?根据 datastax 文档,数据如何更新?对于每个 upsert,cassandra 将删除后插入,因为插入的新时间戳会覆盖旧时间戳。旧时间戳数据必须标记为与墓碑相关的删除。
为什么我们有相互矛盾的陈述?否则我在这里遗漏了什么?
用例:在 Cassandra 中使用唯一键 (uuid) 插入数据,并且此数据中的某些列经常更新。您推荐哪种方法?
哪种方法会或不会创建墓碑?Cassandra 如何处理这两个查询?
我在C#中有一个VS2017解决方案,我正在使用IDocumentClient.UpsertDocumentAsync将一些文档嵌入到我的cosmosdb documentdb集合中.但是我注意到它实际上创建了具有相同id的新文档,而集合中已经存在具有该id的文档.
现在,在插入具有相同id的新文档之后,查询结果如下所示:
select * from c where c.id = "aaaa-bbbb-cccc"
[
{
"id": "aaaa-bbbb-cccc",
"firstname": "john",
"lastname": "doe"
},
{
"id": "aaaa-bbbb-cccc",
"firstname": "john",
"lastname": "doe",
"age": "35"
}
]
Run Code Online (Sandbox Code Playgroud)
我对这种行为很困惑; 也许我没有正确理解"upsert"的定义.如果有人能为我澄清这一点,我将不胜感激.
我有一个带有架构的表:
storeId varchar(255),
ttl int,
date varchar(255),
bytes bigint(255),
UNIQUE KEY storeId_date_index (storeId, date)
Run Code Online (Sandbox Code Playgroud)
我想插入一行(如果不存在),否则更新它。
对于我点击的每个重复键,我想将旧值与新值相加。这个命令怎么可能呢ON DUPLICATE KEY UPDATE?
这是我到目前为止所拥有的:
insert into table (storeId, date, ttl, bytes)
values
('477866', '2019-02-05', 54543543, 100),
('6301', '2019-02-05', 54543543, 999999),
('12345', '2019-02-05', 54543543, 999999)
ON DUPLICATE KEY UPDATE
bytes = oldval + newval # sum old value with new value where storeId and date match in the values
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下查询对名为“message_payload”的表执行 upsert 操作,但出现错误:
错误:没有与 ON CONFLICT 规范 SQL 状态匹配的唯一或排除约束:42P10
询问:
INSERT INTO public.error_message(
id, created_by, created_dt, modified_by, modified_dt, attempt, message_headers,
message_main_topic, message_payload, message_status, message_status_code)
VALUES (51, null, null, null, null, 1, '{
"jsonContent": {
"content-length": "1635",
"message_status_code": "417",
"cookie": "JSESSIONID=279AF4C174E6192BDAB11A067768BBD5",
"postman-token": "f0f33e86-498f-452a-aaf6-18eb84dc5907",
"kafka_timestampType": "CREATE_TIME",
"message_id": "21",
"kafka_receivedMessageKey": "null",
"kafka_receivedTopic": "error-topic",
"accept": "*/*",
"kafka_offset": "33",
"kafka_consumer": "org.apache.kafka.clients.consumer.KafkaConsumer@5091bb5f",
"host": "localhost:8082",
"content-type": "application/json",
"connection": "keep-alive",
"cache-control": "no-cache",
"kafka_receivedPartitionId": "0",
"kafka_receivedTimestamp": "1552305428711",
"accept-encoding": "gzip, deflate",
"message_main_topic": "ldarsQCustomStatistics.1",
"user-agent": "PostmanRuntime/7.6.1"
}
}', 'ldarsQCustomStatistics.1', '{
"jsonContent": …Run Code Online (Sandbox Code Playgroud) 我正在尝试将每日 CSV 加载文件加载到main表中,以便插入所有新记录并更新所有现有记录。我正在使用UPSERTSqlite 的功能来实现此目的。
这是我的 shell 脚本。
LOAD_FILE="/tmp/main.csv"
LOAD_TABLE="tbl_tmp_main"
MAIN_TABLE="tbl_main"
COLUMNS="t_id, t_col1, t_col2"
CREATE_TABLE_QUERY="DROP TABLE IF EXISTS $LOAD_TABLE; CREATE TABLE $LOAD_TABLE AS SELECT $COLUMNS FROM $MAIN_TABLE WHERE false"
LOAD_TABLE_QUERY=".separator ','\n.import '$LOAD_FILE' $LOAD_TABLE"
UPSERT_TABLE_QUERY="
INSERT INTO $MAIN_TABLE($COLUMNS) SELECT $COLUMNS FROM $LOAD_TABLE
ON CONFLICT(t_id) DO UPDATE
SET
t_col1 = excluded.t_col1,
t_col2 = excluded.t_col2
;
"
echo ""
echo "$CREATE_TABLE_QUERY" | sqlite3 mydatabase.sqlite3 # <-- This works
echo "[INFO] Temporary Table Created."
echo "$LOAD_TABLE_QUERY" | sqlite3 mydatabase.sqlite3 # <-- …Run Code Online (Sandbox Code Playgroud) 我创建了下表:
CREATE TABLE t1(
a INT UNIQUE,
b varchar(100) NOT NULL,
c INT,
d INT DEFAULT 0,
PRIMARY KEY (a,b));
Run Code Online (Sandbox Code Playgroud)
在单行上,此 SQL 语句效果很好(SQL 是在代码中生成的):
INSERT INTO t1 (a, b, c, d)
VALUES($params.1, '${params.2}', $params.3, params.4)
ON CONFLICT (a,b) DO
UPDATE SET d=params.4
Run Code Online (Sandbox Code Playgroud)
是否可以一次更新插入多行?对于每次更新, 的值params.4都是不同的。
var sqlStr = 'INSERT INTO t1 (a, b, c, d) VALUES '
for(let i =0 i < params.length; i++){
sqlStr += `(${params[i].1}, '${params[i].2}', ${params[i].3}, ${params[i].4}),`
}
sqlStr = sqlStr.substring(0, sqlStr .length - 2) +')'; …Run Code Online (Sandbox Code Playgroud)