Mysql INSERT INTO ... SELECT .... ON DUPLICATE KEY UPDATE

デルマルキ

このinsert into select duplicate key updateクエリがありますが、2回実行すると、行数が2倍になります。スタックオーバーフローは私にテキストを追加することを望んでいるので、このクエリは非常に自明であるため、皆さんがこれ以上説明する必要はないと思うので、現時点では何かを書いています。

編集1:明確にするために:それは2倍になるべきではありません、私はデータを更新したいです。

編集2:テーブル情報

CREATE TABLE `Distance` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `distanceType_myId` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
   `common_id` int(11) NOT NULL,
   `distance` double NOT NULL,
    PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=786421 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

編集3:テーブル情報を更新

CREATE TABLE `Distance` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `distanceType_myId` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
   `common_id` int(11) NOT NULL,
   `distance` double NOT NULL,
   PRIMARY KEY (`id`),
   KEY `uniqueId` (`distanceType_myId`,`common_id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=786421 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

実際のクエリ:

INSERT INTO Distance (common_id, distance, distanceType_myId)
SELECT 
c.id, 
AVG(
  ROUND(
    (
      6371 * acos(
        cos(
          radians(p.lat)
        ) * cos(
          radians(a.lat)
        ) * cos(
          radians(a.lng) - radians(p.lng)
        ) + sin(
          radians(p.lat)
        ) * sin(
          radians(a.lat)
        )
      )
    )* 1000
  )
) AS distance, 
'culturel' AS distanceType 
FROM 
immobilier_ad_blank AS c 
LEFT JOIN Adresse AS a ON c.adresse_id = a.id 
JOIN POI AS p on p.discr = 'Culturel' 
AND p.lat IS NOT NULL 
AND p.lng IS NOT NULL 
AND p.lat != '' 
AND p.lng != '' 
AND p.lat != 'Latitude' 
AND p.lng != 'Longitude' 
WHERE 
ROUND(
  (
    6371 * acos(
      cos(
        radians(p.lat)
      ) * cos(
        radians(a.lat)
      ) * cos(
        radians(a.lng) - radians(p.lng)
      ) + sin(
        radians(p.lat)
      ) * sin(
        radians(a.lat)
      )
    )
  )* 1000
)< 5000 
AND a.lat IS NOT NULL 
AND a.lng IS NOT NULL 
AND a.lat != '' 
AND a.lng != '' 
AND a.lat != 'Latitude' 
AND a.lng != 'Longitude' 
GROUP BY 
c.id 
ON DUPLICATE KEY 
UPDATE 
common_id = VALUES(common_id),
distanceType_myId = VALUES(distanceType_myId)
ArtisticPhoenix

単純です。一意のキーはありません。テーブルには、代理の識別子(主キー)ではなく、一意の識別子または自然キーが必要です。

主キーはデータとは関係がなく、代理キーです。たとえば、行を見て、その主キーが主キーを持たないものであることを知ることはできません。

自然キーは、名前のみのデータベース内の名前、または電話番号のデータベース内の電話番号のようなものであり、状態のデータベース内の状態である可能性があります。ミシガン州またはオハイオ州のエントリは2つありません。たとえば、それらは独自の権利で一意です。

代理キーは、データに関連していないため、関係に適しているか、外部キーとして使用できます。悪い例は、突然米国が州の略語に文字を追加することを決定した場合です。あなたはあなたのすべての関係を更新しなければならないでしょう。つまり、代理キーはデータに関連していないため、状態レコードを変更でき、データベース内の他のデータを変更する必要はありません。(より良い例は、北と南のミシガンを作ることです)

したがって、それぞれに独自の用途と存在理由があります。

更新

INSERT INTO
    Distance (common_id, distance, distanceType_myId)
    VALUES ( 1,20.0,'culturel' ) 
    ON DUPLICATE KEY UPDATE 
    id = LAST_INSERT_ID( id ),
    common_id = VALUES( common_id ),
    distance = VALUES( distance ),
    distanceType_myId = VALUES( distanceType_myId )

これは私が過去にいくつかの古いコードを読んだ方法であり、それから挿入IDも更新します。

UPDATE1.1ただし、テストで、例外を除いてPDOを使用すると、エラーを無視するだけで挿入のパフォーマンスを向上できることがわかりました。これは、実際に行を更新したくない場合、またはIDが必要な場合です。たとえば、挿入するだけで重複したくない場合(たとえば、コードはテストされていないだけです)

 try{
     $PDO->query( "INSERT INTO
    Distance (common_id, distance, distanceType_myId)
    VALUES ( 1,20.0,'culturel' )" );
 }catch( PDOException $e){
     if($e->getCode() != 24000 ){ //not 100% sure of the code number
        //rethrow if not duplicate key
        throw new PDOException( $e->getMessage(), $e->getCode(), $e );
     }
 }

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Mysql INSERT ... ON DUPLICATE KEY新しいキーで再挿入

分類Dev

Go:ON DUPLICATE KEY UPDATEでSQL RowsAffected

分類Dev

HSQLDBの「ON DUPLICATE KEY UPDATE」機能はMYSQLのように動作しませんか?

分類Dev

UPDATE, INSERT and ON DUPLICATE KEY UPDATE in one query

分類Dev

PostgreSQL BIGSERIAL and "duplicate key" on insert

分類Dev

INSERT ON DUPLICATE KEY UPDATEのトリガー前のMySQL-マニュアルが間違っているようですか?

分類Dev

SQL Insert multiple record while using ON DUPLICATE KEY UPDATE

分類Dev

MySQLは、INSERT INTO SELECT ... ON DUPLICATE KEY UPDATE ... SQLステートメントを使用すると、更新する代わりに新しい行を作成します。

分類Dev

MySQL-INSERT、INSERT IGNORE、ON DUPLICATE UPDATEを1つの有効なクエリに組み合わせる方法は?

分類Dev

INSERT INTO WHERE NOT EXISTS - Getting Duplicate Key Error

分類Dev

"INSERT INTO t(x) .. SELECT MAX(t.x) + 1 .." sometimes returns "DUPLICATE KEY"

分類Dev

mysql query to update duplicate entries

分類Dev

mySQL insert wont update database

分類Dev

Update MySQL table after INSERT

分類Dev

Java+MySQL - adding "on duplicate key update"

分類Dev

Mysql同時SELECT / INSERT

分類Dev

How to On Duplicate Key Update

分類Dev

MySQL Update if duplicate row

分類Dev

mysql insert on duplicate key update, check which one occurred

分類Dev

cannot insert duplicate key in object exception ef

分類Dev

Mysql insert on duplicate key update and delete if key not exists

分類Dev

python mysql DUPLICATE KEY UPDATE rrror

分類Dev

MYSQL INSERT INTO FROM SELECT QUERY

分類Dev

INSERT ... ON DUPLICATE KEY UPDATEがMySQLのキー「PRIMARY」に重複エントリ「x」を与えるのはなぜですか?

分類Dev

MySql Insert Into Select Sum

分類Dev

MySqlのINSERT〜SELECT〜ON DUPLICATE KEYクエリの何が問題になっていますか?

分類Dev

INSERT INTO ... mysqlのSELECT

分類Dev

VB.NETで「INSERT INTO table VALUES() ON DUPLICATE KEY UPDATE」を使用できません

分類Dev

INSERT INTO ... ON DUPLICATE KEY UPDATEは、PHPとmySQLで重複する値を更新しません

Related 関連記事

  1. 1

    Mysql INSERT ... ON DUPLICATE KEY新しいキーで再挿入

  2. 2

    Go:ON DUPLICATE KEY UPDATEでSQL RowsAffected

  3. 3

    HSQLDBの「ON DUPLICATE KEY UPDATE」機能はMYSQLのように動作しませんか?

  4. 4

    UPDATE, INSERT and ON DUPLICATE KEY UPDATE in one query

  5. 5

    PostgreSQL BIGSERIAL and "duplicate key" on insert

  6. 6

    INSERT ON DUPLICATE KEY UPDATEのトリガー前のMySQL-マニュアルが間違っているようですか?

  7. 7

    SQL Insert multiple record while using ON DUPLICATE KEY UPDATE

  8. 8

    MySQLは、INSERT INTO SELECT ... ON DUPLICATE KEY UPDATE ... SQLステートメントを使用すると、更新する代わりに新しい行を作成します。

  9. 9

    MySQL-INSERT、INSERT IGNORE、ON DUPLICATE UPDATEを1つの有効なクエリに組み合わせる方法は?

  10. 10

    INSERT INTO WHERE NOT EXISTS - Getting Duplicate Key Error

  11. 11

    "INSERT INTO t(x) .. SELECT MAX(t.x) + 1 .." sometimes returns "DUPLICATE KEY"

  12. 12

    mysql query to update duplicate entries

  13. 13

    mySQL insert wont update database

  14. 14

    Update MySQL table after INSERT

  15. 15

    Java+MySQL - adding "on duplicate key update"

  16. 16

    Mysql同時SELECT / INSERT

  17. 17

    How to On Duplicate Key Update

  18. 18

    MySQL Update if duplicate row

  19. 19

    mysql insert on duplicate key update, check which one occurred

  20. 20

    cannot insert duplicate key in object exception ef

  21. 21

    Mysql insert on duplicate key update and delete if key not exists

  22. 22

    python mysql DUPLICATE KEY UPDATE rrror

  23. 23

    MYSQL INSERT INTO FROM SELECT QUERY

  24. 24

    INSERT ... ON DUPLICATE KEY UPDATEがMySQLのキー「PRIMARY」に重複エントリ「x」を与えるのはなぜですか?

  25. 25

    MySql Insert Into Select Sum

  26. 26

    MySqlのINSERT〜SELECT〜ON DUPLICATE KEYクエリの何が問題になっていますか?

  27. 27

    INSERT INTO ... mysqlのSELECT

  28. 28

    VB.NETで「INSERT INTO table VALUES() ON DUPLICATE KEY UPDATE」を使用できません

  29. 29

    INSERT INTO ... ON DUPLICATE KEY UPDATEは、PHPとmySQLで重複する値を更新しません

ホットタグ

アーカイブ