sql >> データベース >  >> RDS >> Mysql

MySQLテーブルの新しいデータを監視する

    あなたの質問は不明なままです。 1つのタイプの変更(タイトルごとの「新しいデータ」(INSERT))のみを監視することは、変更を検出するよりも複雑です。 (I want to detect the Changes in my table 簡単なコメントで)

    MySql テーブルのチェックサムを取得する手段を提供します:

    checksum table TABLE_NAME [QUICK | EXTENDED]
    

    InnoDBおよびMyISAMテーブルのMySQLWorkbenchの結果:

    これらの戻り値の変化を監視することで、変化を検出できます。ただし、注意してください:

    • テーブルはChecksum = 1で作成されている必要があります オプション
    • QUICK このオプションは、バージョン5.7.2より前のInnoDBテーブルでは機能しません(IIRCおよび現在のコミュニティバージョンは5.7.14です)。

    幸い、オプションを指定しない場合、MySQLは値を返す最速のオプションを選択するようです。したがって、タイマーのテーブルごとに変更を追跡するのが簡単になります:

    ' 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)
    

    初期化:

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

    タイマーティックイベント:

    ' 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
    

    リストボックスに変更を報告するだけの方法を実行します:

    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
    

    INSERTSのみのようなものを実際に監視するには、ある種のログテーブルを使用する必要があります。そのテーブルをタイムスタンプとおそらくアクションコード(「挿入」、「削除」)で更新するトリガーを追加します。次に、TimeStampに変更がないか確認し、監視以外のアクションを除外します。

    特に、複数のテーブルまたは特定の変更イベントを監視するバージョンは、クラスとしてより適切に機能します。タイマーコードはカプセル化でき、テーブル変更のイベントを発生させる可能性があります。

    • MySQLv。5.6 13.7.2.3チェックサムテーブルの構文



    1. Postgresqlサーバー上のpostgresという名前のデフォルトデータベース

    2. 空白(nullではない)フィールドの場合はCOALESCE()

    3. スタースキーマ

    4. GET_FORMAT()の例– MySQL