MySQL ON DUPLICATE KEY UPDATE是添加新记录而不是UPDATE现有记录

时间:2018-05-15 10:31:21

标签: php mysql

我在堆栈上搜索并尝试应用我找到的许多解决方案,但没有一个正在使用这个。

我对此查询有问题,因为ON DUPLICATE KEY UPDATE是INSERT新结果而不是更新现有结果。

INSERT INTO signal_providers_relations (
    id,
    client_id, 
    provider_id, 
    active_sp, 
    subscription_sp, 
    created_by, 
    cr_datetime, 
    ea_settings_active_sp, 
    ea_settings_sp,
    up_datetime, 
    sp_risk_allocation, 
    sp_max_trades ) 
VALUES (
    '',
    '".$user_id."', 
    '".$r['provider_id']."', 
    '".$r['active_sp']."', 
    '".$r['subscription_sp']."', 
    '".$r['created_by']."', 
    '".$r['cr_datetime']."', 
    '".$r['ea_settings_active_sp']."', 
    '".$r['ea_settings_sp']."', 
    '".$r['up_datetime']."', 
    '".$r['sp_risk_allocation']."', 
    '".$r['sp_max_trades']."'
    )
ON DUPLICATE KEY
UPDATE 
    id = '".$r['id']."'
    client_id = '".$user_id."', 
    provider_id = '".$r['provider_id']."', 
    active_sp = '".$r['active_sp']."', 
    subscription_sp = '".$r['subscription_sp']."', 
    created_by = '".$r['created_by']."', 
    cr_datetime = '".$r['cr_datetime']."', 
    ea_settings_active_sp = '".$r['ea_settings_active_sp']."', 
    ea_settings_sp = '".$r['ea_settings_sp']."', 
    up_datetime = '".$r['up_datetime']."', 
    sp_risk_allocation = '".$r['sp_risk_allocation']."', 
    sp_max_trades = '".$r['sp_max_trades']."'

这是一个包含表格结构的图像

enter image description here

2 个答案:

答案 0 :(得分:0)

假设此表包含特定于单个客户端/提供商关系的数据,那么您的UNIQUE标识符确实是 client_idprovider_id的组合 - 所以您可以删除当前的client_idprovider_id INDEXES,并将其替换为UNIQUE复合索引。

ALTER TABLE `signal_providers_relations` DROP INDEX `client_id`;
ALTER TABLE `signal_providers_relations` DROP INDEX `provider_id`;

ALTER TABLE `test`.`signal_providers_relations` 
    ADD UNIQUE `unique_client_provider` (`client_id`, `provider_id`);

当您尝试为已存在的特定客户端/提供商组合插入数据时,这将为您提供 触发ON DUPLICATE KEY UPDATE的特定唯一键,这就是我认为您正在努力实现。

此时,您很可能会删除无意义的id列,并将刚刚创建的unique_client_provider键更改为PRIMARY - 但这可能会对其他人产生影响部分代码。

答案 1 :(得分:-1)

要避免这种情况,请在查询中使用REPLACE INTO而不是INSERT INTO