编辑数据库中的重复值

时间:2017-09-18 12:41:57

标签: c# sql-server winforms

我有一个DataGrid View从我的数据库中提取一些项目。我想要实现的是能够编辑包大小或bar_code字段。我知道如何更新数据库中的值,但如果数据相同,我将如何进行更新?在许多情况下,条形码的含义是多个包装尺寸与一个条形码编号相关。我们说我有以下屏幕截图。发生了数据输入错误,bar_code和PackSize列完全相同。我想将第一个条形码更改为" 1234。"我怎么做到这一点?我无法将条形码更新为#textBox1.Text'其中bar_code =' 771313166386'因为它会改变两个数据。我如何一次只关注一行数据?

enter image description here

5 个答案:

答案 0 :(得分:2)

您可以尝试使用此查询仅更新第一行:

UPDATE TOP (1) my_table
SET bar_code = '1234'
WHERE bar_code = '771313166386'
  

您的表格中应该有auto-increment id列或Primary key

答案 1 :(得分:1)

我建议你在后端处理数据重复操作的逻辑,而不是将它们拉到网格中并在那里处理它。

以下查询将帮助您根据提到的列检索重复记录。您可以根据您的要求将其更改为UPDATE或DELETE。

-- Using cte and ranking function
    ;With CTE
    As
    (
        Select 
            Product,
            Description,
            BarCode,
            PackSize
            Row_Number() Over(Partition By Product, BarCode, PackSize Order By Product) As RowNum
        From YourTable
    )
    Select * From CTE
    -- Where RowNum > 1;

希望这有用:)

答案 2 :(得分:1)

这可能无法直接帮助您解答。但是,重要的是要提到您的表设计不正确。您应该通过在表格中创建主键来确保data integrity

因此,当您需要更新产品时,您只需要更新一行。

然后,您可以添加更多表并在它们之间使用外键引用。

答案 3 :(得分:1)

您需要唯一地代表产品。根据您的示例数据,我猜您桌面上没有任何主键。 您可以做的是在列上指定唯一约束以确保无法完成此类数据输入。 如果您无法提供唯一标识行的列列表,则可以通过指定Identity列来使用代理键,然后在更新时始终将约束放在thisIdentityColumn=value

答案 4 :(得分:0)

  

发生了数据输入错误,bar_code和PackSize列都是   完全相同的

我认为这是关键。从本质上讲,确切的重复是无意的,行应该是唯一的。此外,bar_code + pack_size似乎是您的主键(正确输入数据)。

因此,当您进行更新时,只需更新找到的匹配bar_code和pack_size的第一行。如果它不是唯一的,那么更新应确保您距离数据库中的唯一行更近一步。

如果您需要非口头答复,请告诉我。