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

複数の主キーを使用したmysqlREPLACEクエリ

    違いはありません。同じ構文です。両方のキーが列として指定されていることを確認してください。例:

    REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` /* , ... */ )
      VALUES ( 'widgets', 14, 'Blue widget with purple trim' );
    

    編集

    これが、データを破壊しようとしていないことを確認するためにテストデータベースで実行したテストです。もちろん、よくわからない場合は試してみることをお勧めします!

    CREATE SCHEMA `my_testdb`;
    USE `my_testdb`;
    CREATE TABLE `my_table` (
      `key1` VARCHAR(20) NOT NULL,
      `key2` INTEGER NOT NULL,
      `othercolumn1` VARCHAR(50),
      CONSTRAINT PRIMARY KEY (`key1`, `key2`) );
    REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
      VALUES ( 'widgets', 14, 'Green widget with fuchsia trim' );
    REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
      VALUES ( 'widgets', 15, 'Yellow widget with orange trim' );
    REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
      VALUES ( 'thingamabobs', 14, 'Red widget with brown trim' );
    REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
      VALUES ( 'widgets', 14, 'Blue widget with purple trim' );
    SELECT * FROM `my_table`;
    

    これが私の結果です:

    key1          key2  othercolumn1
    widgets       14    Blue widget with purple trim
    widgets       15    Yellow widget with orange trim
    thingamabobs  14    Red widget with brown trim
    

    別の編集

    ドキュメントであなたが話していること、ユニークな列をめぐる混乱がわかると思います:

    これは、置き換える行が既存の主キーだけでなく、他の一意の列とも競合するという、かなり不自然な状況を指します。この点を説明する別の例を次に示します。

    CREATE SCHEMA `my_testdb2`;
    USE `my_testdb2`;
    CREATE TABLE `my_table` (
      `key1` VARCHAR(20) NOT NULL,
      `key2` INTEGER NOT NULL,
      `color` VARCHAR(20) NOT NULL UNIQUE,
      `othercolumn1` VARCHAR(50),
      CONSTRAINT PRIMARY KEY (`key1`, `key2`) );
    REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
      VALUES ( 'widgets', 14, 'green', 'Green widget with fuchsia trim' );
    REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
      VALUES ( 'widgets', 15, 'yellow', 'Yellow widget with orange trim' );
    REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
      VALUES ( 'thingamabobs', 14, 'red', 'Red widget with brown trim' );
    REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
      VALUES ( 'widgets', 14, 'yellow', 'Yellow widget with purple trim' );
    SELECT * FROM `my_table`;
    

    最後のREPLACE操作が(key1と競合するだけでなく、どのように競合するかに注意してください。 、key2 )最初のREPLACEの主キーですが、2番目のキーの固有の色も使用します。この場合、最後のREPLACE操作が実行される前に両方の行が削除されるため、結果に競合は発生しません。最終的には2行になります:

    key1          key2  color   othercolumn1
    widgets       14    yellow  Yellow widget with purple trim
    thingamabobs  14    red     Red widget with brown trim
    

    key1の両方の行 、key2 )等しい('ウィジェット'、14) AND 新しい行がテーブル上の複数の一意の制約と競合しているため、「黄色」の色の行が吹き飛ばされました。

    これがお役に立てば幸いです!




    1. ODP.NETのデフォルトでOracleCommand.BindByNameを強制的にtrueにする方法はありますか?

    2. このmySQLクエリをPHPファイルに正しく実装して結果を表示するにはどうすればよいですか?

    3. 複数のパラメータを持つEXECsp_executesql

    4. SparkSQLおよびMySQL-SaveMode.Overwriteは変更されたデータを挿入しません