5

まず第一に、私はMySQLに非常に慣れていないので、MySQLを学習しながら学習しようとしています。

シンジケートタイプのデータを取得してMySQLデータベーステーブルに追加する、ページの読み込み時に実行されるスクリプトがあります。

前のページの読み込みで見つかった重複を追加せずに、見つかった新しいデータをデータベーステーブルに追加するだけです。

私のデータベーステーブルは次のとおりです。

// Creates a Database Table only if the Table does not already exist
        mysql_query("CREATE TABLE IF NOT EXISTS $TableName(
          id INT NOT NULL AUTO_INCREMENT,
          PRIMARY KEY (id),
          Field_2    varchar(255) NOT NULL default '',
          Post_Date  int(11) NOT NULL default '0',
          Field_4    varchar(10) NOT NULL default '',
          Field_5    varchar(12) NOT NULL default '',
          Field_6    longtext NOT NULL default '',
          Field_7    longtext NOT NULL default '',
          Field_8    longtext NOT NULL default '') ") or die(mysql_error()
        );

以下に示すように、単一のインデックスがあります。

Action     Keyname  Type  Unique Packed Column Cardinality Collation Null Comment
Edit Drop  PRIMARY  BTREE Yes    No     id     830         A   

Post_Dateフィールドは常に一意(UNIX形式)であるため、重複の判別に使用できます。

現在、次のコードを使用してデータベーステーブルにデータを入力し、重複を削除しています。

// Enter the $sql Data into the MySQL Database Table
     mysql_query("INSERT INTO $TableName (id, Field_2, Post_Date, Field_4, Field_5, Field_6, Field_7, Field_8) VALUES ".implode(',', $sql));
// Removes Duplicates from the MySQL Database Table based on the 'Post_Date' field
     mysql_query("Alter IGNORE table $TableName add unique key (Post_Date)");
// Deletes the added index key created by the Removes Duplicates function
     mysql_query("ALTER TABLE $TableName DROP INDEX Post_Date");

問題は、Webページが何度もヒットされ、多くのインデックスが作成されると、DROPINDEXクエリが失敗することです。

追加のインデックスを削除する解決策はありますが、他のユーザーから、この方法を完全に避けて、INSERT ... ON DUPLICATE KEYUPDATEhttp://dev.mysql.com/doc/refman/に似た別の方法を試すように言われました 。 5.0 / en / insert-on-duplicate.html

しかし、それを機能させるためにクエリを構築する方法がわかりません。

調査したところ、重複せずにテーブルにデータを入力する方法を説明している次のWebページが見つかりました:http ://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm

Webページには次の例が記載されています。

mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES( 'Jay', 'Thomas');

しかし、クエリコードを変更して機能させる方法がわかりません。

クエリにIGNOREを追加しようとしましたが、テーブルへの重複エントリも許可されました。

mysql_query("INSERT IGNORE INTO $TableName (id, Field_2, Post_Date, Field_4, Field_5, Field_6, Field_7, Field_8) VALUES ".implode(',', $sql));

助けていただければ幸いです、ありがとうございます。

4

1 に答える 1

3

一意のインデックスを配置してレコードの重複を防ぎ、エラーが発生しないようにignoreキーワードを追加して挿入クエリを実行します(挿入が重複している場合)。

テーブルに一意のインデックスが存在すると、通常、インデックスを定義する1つまたは複数の列の既存のレコードと重複するレコードをテーブルに挿入すると、エラーが発生します。

INSERTではなくINSERTIGNOREを使用します。レコードが既存のレコードと重複しない場合、MySQLは通常どおりそのレコードを挿入します。レコードが重複している場合、IGNOREキーワードは、エラーを生成せずにレコードをサイレントに破棄するようにMySQLに指示します。

編集:

sqlfiddleでサンプルを確認してください。

http://sqlfiddle.com/#!2/4ad8a/3

Edit2:

CREATE TABLE IF NOT EXISTS TestTable(
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `Field_2` VARCHAR(255) NOT NULL DEFAULT '',
    `Post_Date` INT(11) NOT NULL DEFAULT '0',
    `Field_4` VARCHAR(10) NOT NULL DEFAULT '',
    `Field_5` VARCHAR(12) NOT NULL DEFAULT '',
    `Field_6` LONGTEXT NOT NULL,
    `Field_7` LONGTEXT NOT NULL,
    `Field_8` LONGTEXT NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `Post_Date` (`Post_Date`)
)
于 2012-04-18T18:44:34.010 に答える