如何将新行作为mysql中previous和UPDATE旧行值的副本插入

时间:2017-10-12 21:53:50

标签: c# mysql

我正在寻找一种简单的方法来解决当前的挑战。我有下表:

Id Location DateFrom   DateTo     RateType     Rate 
1  LA       01/01/2017 01/01/2018 AverageRate  18 

我的代码中有一些mysql命令可以选择这些值并将它们显示到textboxes / datepickers:

public partial class MainWindow : 
{
public MainWindow()
{
    InitializeComponent();
    string connectionString = "datasource= ;port=3306;username= ;password= ";
    MySqlConnection connection = new MySqlConnection(connectionString);
    MySqlCommand sAR = new MySqlCommand("Select Amount from Daily.Rates where RateType = 'Average Hourly Wages'", connection);
    MySqlCommand sARF = new MySqlCommand("Select DateFrom from Daily.Rates where RateType = 'Average Hourly Wages'", connection);
    MySqlCommand sART = new MySqlCommand("Select DateTo from Daily.Rates where RateType = 'AverageRate'", connection);

    try
    {
        connection.Open();
        txtAR.Text = sAHW.ExecuteScalar().ToString();
        dfAR.Text = sAHWF.ExecuteScalar().ToString();
        dtAR.Text = sAHWT.ExecuteScalar().ToString();
    }

    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    connection.Close();
}

我想要实现的目标:

如果我需要将速率提高到20,我希望保持18的旧速率,添加具有更新值的该行的副本,并按如下方式更改DateTo字段:new DateFrom - 1.基本上如果我更改了今天我想最终得到这个:

Id Location DateFrom   DateTo                 RateType     Rate
1  LA       01/01/2017 10/11/2017(DateFrom-1) AverageRate  18
2  LA       10/12/2017 01/01/2018             AverageRate  20

我有很多textxbox可能不会改变,所以如果没有任何值发生变化,我不想插入新行,只需保留旧值。编写此查询的最佳方法是什么?我如何才能有效地将if语句与Insert,Update和Select以及我在文本框中已有的内容结合起来以实现我的目标?谢谢。

1 个答案:

答案 0 :(得分:2)

可能重复Select Modify and Insert into the same table

您需要两个查询,因为有INSERTUPDATE。为了确保您没有获得竞争条件,您必须在TRANSACTION中进行。为此,我建议使用存储过程。

假设您的输入值为DateFromNewRateOldRate以及Id字段自动递增:

delimiter #

CREATE PROCEDURE Keep_Old_Row
(
IN p_DateFrom DATETIME, 
IN p_NewRate INT,
IN p_OldRate INT
)
BEGIN

INSERT INTO Daily.Rates
(Location, DateFrom,   DateTo,     RateType,     Rate  )
SELECT Location, p_DateFrom, DateTo, RateType, p_NewRate 
FROM Daily.Rates
WHERE Rate=p_OldRate;

UPDATE Daily.Rates
SET DateTo=DATE_SUB(p_Date_From, INTERVAL 1 DAY), Rate=p_NewRate
WHERE Rate=p_OldRate;

END#

delimiter ;

HOWEVER ,您将需要其他字段,因此:

INSERT INTO Daily.Rates
(Location, DateFrom,   DateTo,     RateType,     Rate [,... Other Fields]  )
SELECT Location, p_DateFrom, DateTo, RateType, p_NewRate  [,... Other Fields]

真的是你想要的。