标签: insert-update

使用sqlalchemy检查行和返回id的存在是否缓慢

所有,

我正在读一个csv文件并使用sqlalchemy将数据添加到MySQL数据库.其中一个表是地址表,它只能保存唯一的地址.这些地址与另一个具有地址id的外键字段的"语句"表之间存在关系.

因此,对于我的数据文件中的每一行,我创建一个新的语句obj,然后获取相关地址的id.如果地址已存在,则返回该id.否则,我创建一个新的地址obj并返回该id.这是使用下面的代码完成的,改编自这个SO问题.

def get_or_create(self, model, rec):
    instance = self.session.query(model).filter_by(**dict(filter(lambda (x,y): x in model.__dict__.keys(), rec.iteritems()))).first()
    if instance:
        return instance
    else:
        instance = model(rec)
        return instance
Run Code Online (Sandbox Code Playgroud)

我正在使用GUID作为我的id字段,它是地址表的主键的一部分:

class address(Base):
    __tablename__ = 'address'
    id = id_column()
    name               = Column(String(75), primary_key=True)
    Address_Line_One   = Column(String(50), primary_key=True)
    Address_Line_Two   = Column(String(50), primary_key=True)
    Address_Line_Three = Column(String(50), primary_key=True)
    Address_Line_Four  = Column(String(50), primary_key=True)
Run Code Online (Sandbox Code Playgroud)

id_column()来自这里,虽然它已被转换为CHAR(32)由于限制别处.最后,这里有一个片段:

currStatement   = statements(rec, id=currGUID)
currStatement.address = self.get_or_create(address, rec)
Run Code Online (Sandbox Code Playgroud)

这一切都很好,除非它很慢.对于在一个事务中插入的~65,000个语句,我看到干净测试DB上的1.5小时插入时间.实时观察插入显示它快速达到~10,000行,然后插入速度开始下降.

我该怎么做才能加快插入时间?

编辑:

经过进一步测试,我发现插入时间慢是因为每个对象都是单独插入的.所以,我有~65,000行,每行都有几个sqlalchemy对象,单独插入.使用sqlalchemy 0.7,我如何批量插入对象?

mysql bulkinsert sqlalchemy insert-update

3
推荐指数
1
解决办法
1881
查看次数

如何在 CakePHP 3 中实现 INSERT ON DUPLICATE KEY UPDATE aka upsert?

我正在使用 CakePHP 3 和 MySQL。

我想通过模型实现INSERT on DUPLICATE KEY UPDATE又名upsert查询CakePHP 3

鉴于下表:

+----+----------+-----+
| id | username | age |
+----+----------+-----+
|  1 | admin    |  33 |
|  2 | Timmy    |  17 |
|  3 | Sally    |  23 |
+----+----------+-----+
Run Code Online (Sandbox Code Playgroud)

其中id是主键,username是唯一索引

当我有以下值等待更新时:

Felicia, 27
Timmy, 71
Run Code Online (Sandbox Code Playgroud)

我希望在 upsert得到以下结果:

+----+----------+-----+
| id | username | age |
+----+----------+-----+
|  1 | admin    |  33 |
| …
Run Code Online (Sandbox Code Playgroud)

mysql cakephp upsert insert-update cakephp-3.0

3
推荐指数
1
解决办法
1898
查看次数

如果存在 UPDATE else INSERT 对于表的每一行

我有一个名为 tableFrom 的表想要插入到名为 tableTo 的表中。插入效果很好,但是如果我再次插入相同的值,则会出现重复键错误。所以我只想更新已经存在的行。我知道命令 ON DUPLICATE with MySQL,不幸的是在 SQL Server 中丢失了。

如果我只想检查一个精确的行,这很容易:

IF EXISTS PK = @PK
Run Code Online (Sandbox Code Playgroud)

但是我正在尝试为整张桌子这样做,我不知道是否可能。我想用游标检查每一行,我是 SQL 的新手。

这是我想出的:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
IF EXISTS   (
            SELECT 
                1 
            FROM 
                tableFrom F,
                tableTo T
            WHERE 
                T.product = F._product
            )
    BEGIN
        UPDATE
            tableTo
        SET
            T.something = F.something
        FROM
            tableTo T
                INNER JOIN 
                    tableFrom F
                ON
                    T.product = F._product
    END
ELSE
    BEGIN
        INSERT INTO tableTo
            (product, 
            something)
        SELECT
            F._product, 
            F.something
        FROM
            tableFrom F
    END
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

UPDATE …

sql-server insert-update

3
推荐指数
2
解决办法
6355
查看次数

MySQL - 插入一条主键为空的记录,适用于一台服务器,而不是另一台

我在 MySQL 服务器(版本 5.5.27,安装了 EasyPHP 用于开发)中有一个表,它有一个带有 Auto_Increment 的 ID,它的数据类型是 INT(11)。

当我尝试使用此语句插入记录时,它可以工作。

insert into factclientes (IDFactClientes, IDTercero, SubTotal, IVA, Total)
        values ('', '3', '2500.00', '400.00', '2900.00')
        ON DUPLICATE KEY UPDATE IDTercero = values(IDTercero),
                SubTotal = values(SubTotal), 
                IVA = values(IVA), 
                Total = values(Total)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在我的生产服务器(版本 5.6.17,独立安装在另一台机器上)上插入相同的记录时,它会引发错误:

 Incorrect integer value: '' for column 'IDFactClientes' at row 1
Run Code Online (Sandbox Code Playgroud)

我知道这是因为主键 ID 'IDFactClientes' 有一个空值。我这样做是因为我对 INSERT 和 UPDATE 使用了相同的语句。如果我的程序不知道并且没有指定 IDFactClientes,我想要一个新记录,如果我的程序已经知道 ID,并且指定了我想要更新记录。

奇怪的是它可以在我的开发机器上运行,但不能在我的生产服务器上运行。

是不是缺少什么设置??我怎么能解决这个问题??我的数据库的所有表都有完全相同的问题,我不想修改程序中的所有语句......如果可能的话

先感谢您!!

mysql string insert-update auto-increment

3
推荐指数
1
解决办法
2691
查看次数

Java上的MySQL"INSERT ... ON DUPLICATE KEY UPDATE":如何区分插入/更新/ NoChange状态

我对MySQL的INSERT ... ON DUPLICATE KEY UPDATE语句的返回值感到困惑.当我在MySQL客户端(mysql终端,phpmyadmin或MySQL Workbench)上尝试它时,执行结果具有以下之一:

  • 1:如果插入新记录(即没有重复键).
  • 2:如果现有记录在重复密钥的情况下更新.
  • 0:如果执行了更新但没有更改列值.

这些结果很有意义.但是,当我在Java中执行相同的查询(使用mysql-connector 5.1.34)时,JDBC的executeUpdate方法在插入和不更改的情况下返回1,在成功更新的情况下返回2.更新无效时,它不返回0.

这是MySQL JDBC驱动程序的错误吗?如果是这样,是否有一个没有这个bug的版本?如果这不是错误,我如何获得MySQL客户端返回的相同结果?

java mysql jdbc insert-update

3
推荐指数
1
解决办法
1329
查看次数

Firebird 2.5 更新或插入

我不知道如何在 Firebird 中编写 SQL 语句,因此它应该添加新行,并且如果某些条件满足则更新其他列。

例子:

(在MySql中看起来像这样:)

insert into 
table (col1, col2, col3) values ('a', 'b', 'c')
on duplicate key update col4=col3;
Run Code Online (Sandbox Code Playgroud)

sql firebird insert-update firebird2.5

3
推荐指数
1
解决办法
7511
查看次数

Mongo DB 中 UpdateOne() 和 findOneAndUpdate 方法之间的区别

MongoDB中的方法UpdateOne()和方法有什么区别?findOneAndUpdate()我似乎无法理解他们的差异。如果可以使用使用UpdateOne()and 的演示示例,将不胜感激。findOneAndUpdate

insert-update mongodb mongodb-query mongodb-update

3
推荐指数
1
解决办法
1734
查看次数

使用多字段索引打开DUPLICATE KEY UPDATE

我有一个测试表,有一个行条目和2个索引,第一个是主键,然后是a和b列的唯一索引:

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) NOT NULL,
  `b` int(11) NOT NULL,
  `c` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `a` (`a`,`b`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

--
-- Dumping data for table `test`
--

INSERT INTO `test` (`id`, `a`, `b`, `c`) VALUES
(1, 1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

现在我想尝试做以下事情

INSERT INTO test
   (a, b, c)
VALUES (1, 2, 100)
ON DUPLICATE KEY UPDATE c = c
Run Code Online (Sandbox Code Playgroud)

我希望将列c的值更新为3到100.但这并没有发生,我没有错误.我究竟做错了什么?

mysql sql insert-update

2
推荐指数
1
解决办法
1252
查看次数

MYSQL - 更新另一个表中的多行

我有2张桌子.一个来自昨天(300k行),另一个来自今天,具有相同的行数,但数据在某些列中发生了变化.

这两个表有大约120列.

我如何只更新更改.
我尝试过使用删除:

   delete from tableA
   where id in (select id from tableB)
Run Code Online (Sandbox Code Playgroud)

但它太慢了.
也试过了

   update tableA inner join tableB
   on tableA.id=TableB.id
Run Code Online (Sandbox Code Playgroud)

它没有奏效.

在此输入图像描述

mysql insert-update

2
推荐指数
1
解决办法
3254
查看次数

如何以正确的方式更新数组中的所有项目

有货币汇率的数组,并且在inputTextField中输入了金额之后,我想更新此货币上的该数组中的所有项目,并将该货币放在tableView中,尝试使用循环来执行此操作,但这不能正常工作,因为这是解决方案刚刚放在表中的每个循环

inputTextField是文本字段的名称

receivedRates:[Double] = [1.1,1.6,2.0,1.3] // just example of the rates

for i in receivedRates {

    let newValue = Double(i)*Double(Int(inputTextField.text!)!)
    currentAmount.append(newValue)
    receivedRates = currentAmount
}
Run Code Online (Sandbox Code Playgroud)

如何不循环地更新此数组,或者可能对此循环有其他解决方案?

arrays items insert-update ios swift

2
推荐指数
2
解决办法
2297
查看次数