sql >> Databasteknik >  >> RDS >> Mysql

Övervaka nya data i MySQL-tabellen

Din fråga är fortfarande otydlig. Att övervaka endast en typ av förändring - "ny data" (INSERT) enligt rubriken - är mer komplicerat än att upptäcka någon förändring (enligt Jag vill upptäcka ändringarna i min tabell i kommentarer vilket är enklare).

MySql ger möjlighet att få kontrollsumman för en tabell:

checksum table TABLE_NAME [QUICK | EXTENDED]

MySQL Workbench-resultat för en InnoDB- och MyISAM-tabell:

Genom att se efter ändringar i dessa returvärden kan du upptäcka alla ändringar. Men notera:

  • Tabellen måste ha skapats med Checksum =1 alternativ
  • SNABB alternativet fungerar inte på InnoDB-tabeller före version 5.7.2 (IIRC och den nuvarande communityversionen är 5.7.14).

Lyckligtvis, om du inte anger ett alternativ, verkar MySQL välja det snabbaste som kommer att returnera ett värde. Så det blir lätt att spåra ändringar efter tabell på en timer:

' Track last checksum by table
Friend Class TableItem
    Public Property Name As String
    Public Property CheckSum As Int64

    Public Sub New(n As String)
        Name = n
        CheckSum = 0
    End Sub
End Class
' a list of them to track more than one table:
Private Tables As List(Of TableItem)

Initiera:

Timer1.Enabled = True

Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))

Timer Tick-händelsen:

' Note: cannot use Parameters for table or col names
Dim sql = "CHECKSUM TABLE {0} "

Using dbcon As New MySqlConnection(mySQLConnStr)
    dbcon.Open()
    Using cmd As New MySqlCommand(sql, dbcon)
        ' loop thru collection, polling one at a time
        For Each tbl As TableItem In Tables
            cmd.CommandText = String.Format(sql, tbl.Name)

            Using rdr As MySqlDataReader = cmd.ExecuteReader()
                If rdr.Read Then
                    Dim thisResult = rdr.GetInt64(1)

                    ' ignore the first result
                    If tbl.CheckSum = 0 Then
                        tbl.CheckSum = thisResult
                        Return
                    End If
                    ' save the last non-zed value
                    If tbl.CheckSum <> thisResult Then
                        tbl.CheckSum = thisResult
                        ' method to do something when changed:
                        TableChanged(tbl.Name)
                    End If

                End If
            End Using
        Next
    End Using
End Using

Jag gör något sätt att vi bara rapporterar ändringarna till en listbox:

Private Sub TableChanged(tbl As String)
    lb.Items.Add(String.Format("Table {0} changed {1}", tbl,
                               DateTime.Now.ToString("HH:mm:ss.ffffff")))
End Sub

För att faktiskt titta efter något som bara INSLAG, måste du använda någon sorts loggtabell. Lägg till en trigger som uppdaterar den tabellen med en tidsstämpel och kanske åtgärdskod ("infoga", "radera"). Sedan är det bara att kontrollera tidsstämpeln för ändringar, kanske filtrera bort icke-bevakade åtgärder.

Speciellt en version för att titta på flera bord eller vissa förändringshändelser kommer att fungera bättre som klass. Timerkoden kan kapslas in och det kan leda till händelser för en tabelländring.




  1. PHP, MySQL-fel:Kolumnantal matchar inte värderäkning på rad 1

  2. Hur man får månaden från ett datum i MySQL

  3. är det vanligt att ha miljontals tabeller och miljontals rader inom dem i MySQL-databasdesign?

  4. 5 anledningar till att Microsoft Access är bra för nystartade företag