我注意到我的脚本变得很慢,然后我缩小了问题:这是一个更新查询.奇怪的是SELECT查询非常快.该表有大约600,000个条目.是的,id是UNIQUE PRIMARY KEY.这里有些例子:
SELECT * FROM `tmp_pages_data` WHERE id = 19080 LIMIT 0 , 30
Showing rows 0 - 0 (1 total, Query took 0.0004 sec)
Run Code Online (Sandbox Code Playgroud)
现在更新查询:
UPDATE tmp_pages_data SET page_status = 1 WHERE id = 19080
1 row(s) affected. ( Query took 24.5968 sec )
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,选择非常快,但更新速度很慢.这怎么可能?
如何使用SQL在单个语句中更新多个记录?:
UPDATE records
SET name='abc' where id=3,
SET name='def' where id=1
Run Code Online (Sandbox Code Playgroud) 就像这样,Rails从原始SQL中抽象出来让我感到沮丧.在MySQL中,我可以这样做:
UPDATE FROM tasks AS t
LEFT JOIN projects as p
ON t.project_id = p.id
SET t.invoice_id = 7
WHERE p.organization_id == 42
AND t.invoice_id IS NULL
Run Code Online (Sandbox Code Playgroud)
如何在Rails 3.0.1中以预先加载的方式执行此操作?我已经尝试了以下所有方法:
Tasks.joins(:project).where('projects.organization_id' => 42, :invoice_id => nil).update_all( :invoice_id => 7 )
Run Code Online (Sandbox Code Playgroud)
以及上述的所有变化.所有人都给出了错误或没有找到任何东西.
然后我试着用scope:
Task.scope :find => {:joins => :project, :conditions => ["projects.organization_id == ? AND invoice_id IS NULL", @organization.id] } do
Task.update_all :invoice_id => @invoice.id
end
Run Code Online (Sandbox Code Playgroud)
这个给了我错误undefined method 'to_sym' for #<Hash:0x1065c6438>.
我花了太多时间来处理这个问题,只是为了复制一个简单的SQL查询.请帮忙!
编辑:绕过n + 1的临时坏解决方案:
task_ids = Task.select('tasks.id').joins(:project).where('projects.organization_id' …Run Code Online (Sandbox Code Playgroud) 我有一个包含列的表name,client_name和requester_name.我需要将这些列的值从"Mic"更新为"Michael".
以下是一些应该更新的记录:
name | client_name | requester_name
------+-------------+----------------
Mic | Jerry | Jack
Jack | Mic | Mic
Jerry | Jack | Mic
Run Code Online (Sandbox Code Playgroud)
我尝试了以下查询:
UPDATE names
SET name='Michael', client_name='Michael', requester_name='Michael'
WHERE name='Mic' OR client_name='Mic' OR requester_name='Mic';
Run Code Online (Sandbox Code Playgroud)
此查询使所有列都将所有名称更改为"Michael".
查询应该如何仅在适用的情况下应用更改?
是否有可能升级bool字段,告诉它将字段更新为与其相反的字段而不必选择值 - 检查它然后相应地更新,这看起来很长...
我的意思的一个伪示例
UPDATE `table` SET `my_bool` = opposite_of(my_bool)
Run Code Online (Sandbox Code Playgroud)
目前我必须在一个查询中选择my_bool,然后快速检查其值,以便我可以在第二个查询中更新表.
如果有可能的话,我希望将其减少到一个查询?
I have to update many columns in many rows in PostgreSQL 9.1. I'm currently doing it with many different UPDATE queries, each one that works on a different row (based on the primary key):
UPDATE mytable SET column_a = 12, column_b = 6 WHERE id = 1;
UPDATE mytable SET column_a = 1, column_b = 45 WHERE id = 2;
UPDATE mytable SET column_a = 56, column_b = 3 WHERE id = 3;
Run Code Online (Sandbox Code Playgroud)
我必须做几千个这样的查询.
无论如何,我可以在PostgreSQL的一个查询中"批量更新"大量行吗?如果你正在使用INSERT,你可以一次插入多行:( INSERT INTO mytable …
我有stock_price_alert3列的表.stock_price_id是PRIMARY KEY和FOREIGN KEY其他表.表定义如下:
create table stock_price_alert (
stock_price_id integer references stock_price (id) on delete cascade not null,
fall_below_alert boolean not null,
rise_above_alert boolean not null,
primary key (stock_price_id)
);
Run Code Online (Sandbox Code Playgroud)
我需要:
1)INSERT记录如果不存在
-- query 1
INSERT INTO stock_price_alert (stock_price_id, fall_below_alert, rise_above_alert)
VALUES (1, true, false);
Run Code Online (Sandbox Code Playgroud)
2)UPDATE记录是否存在
-- query 2
UPDATE stock_price_alert SET
fall_below_alert = true,
rise_above_alert = false
WHERE stock_price_id = 1;
Run Code Online (Sandbox Code Playgroud)
首先,我需要SELECT在stock_price_alert表上发出查询,以决定是执行查询(1)还是(2).
Postgres支持INSERT …
我正在尝试使用函数更新PostgreSQL表.
我的功能:
CREATE OR REPLACE FUNCTION update_array_words(varchar, varchar[], int[], int, int)
RETURNS int AS $$
DECLARE
passed int;
j int;
k int;
BEGIN
passed := 0;
j := $4 + $5;
k := 0;
FOR i IN $4..j LOOP
UPDATE tab_files
SET key_words[i] = $2[k], num_key_words[i] = $3[k]
WHERE path_to_file = $1;
END LOOP;
RETURN passed;
END;
$$
LANGUAGE plpgsql
;
Run Code Online (Sandbox Code Playgroud)
为了调用我的函数:
SELECT update_array_words('path_name_to_file', '{"susana"}', '{1}', 1, 1);
Run Code Online (Sandbox Code Playgroud)
问题是,当我在PostgreSQL命令行中进行简单的选择时,来自更新的数据是null.
我的选择:
SELECT * FROM tab_files;
Run Code Online (Sandbox Code Playgroud)
输出:
key_words num_key_words
| …Run Code Online (Sandbox Code Playgroud) 如何使用将一列的现有值映射到另一列所需的新值的字典更新数据库中的多个现有行?
我有一张桌子:
class MyTable(BaseModel):
col1 = sa.Column(sa.String(256))
col2 = sa.Column(sa.String(256))
Run Code Online (Sandbox Code Playgroud)
鉴于col1已经有值并且col2为空,col2如果我将数据集作为字典,我该如何更新:
payload = {'x': 'y', 'a': 'b', 'c': 'd'}
Run Code Online (Sandbox Code Playgroud)
因此,此有效负载将 , 的值映射col1到 的新值col2;更新后,您[{'col1': 'x', 'col2': 'y'}, ...]将从数据库中获得。
我尝试了几种方法,它们实际上有效,但我认为它们并不像它可能的那样最佳:
my_table = MyTable.__table__
for key, value in payload.items():
stm = my_table.update()
stm = stm.where(getattr(sales_order_item.c, 'col1') == key)
stm = stm.values({'col2': value})
session.execute(stm)
Run Code Online (Sandbox Code Playgroud)
或者像这样
for key, value in payload.items():
query = session.query(MyTable).filter(MyTable.col1==key)
query.update({MyTable.col2: value})
Run Code Online (Sandbox Code Playgroud)
现在这两种解决方案都按预期工作,唯一困扰我的是它所花费的时间,例如,对于 100 个元素的有效载荷,它最多需要 6 秒,我几乎可以肯定应该有更好的方法这样做,不是吗? …
我有一个 postgres 表,有 2 列
用户名和电子邮件我的表中有数百行,例如
username | email
username1 | test@abc.com
username2 | test@abc.com
username3 | test@abc.com
username4 | test@abc.com
Run Code Online (Sandbox Code Playgroud)
所有电子邮件的设置方式都是相同的,现在我需要使它们独一无二。我正在尝试将电子邮件列更新为这样
username | email
username1 | username1_test@abc.com
username2 | username2_test@abc.com
username3 | username3_test@abc.com
username4 | username4_test@abc.com
Run Code Online (Sandbox Code Playgroud)
基本上复制用户名列中的值并将其添加到电子邮件列中。我尝试使用合并函数,但这将完全替换该值并且不会更新它。
请您帮助我了解如何实现这一目标。
谢谢
sql-update ×10
sql ×6
postgresql ×5
mysql ×2
pdo ×1
performance ×1
python ×1
ruby ×1
scope ×1
sql-insert ×1
sql-server ×1
sqlalchemy ×1