3

私は PHP を使用しており、MySQL DB に新しいレコードを挿入するか、存在する場合は単純に更新する必要があります。REPLACEorの使用を提案しているいくつかの回答を読みましたが、INSERT...ON DUPLICATE KEY UPDATEよく理解していれば、これらの 2 つのオプションは一意のフィールドまたは主キー (一意) の使用を意味します。私の場合、MySQL テーブルには次のような値があります。

Timestamp            | Query1   | Query2   | Result
-------------------------------------------------------- 
2012-10-13 08:15:27  | American | Men      | here result

2012-10-13 08:15:23  | American | Men      | result2

2012-10-13 08:15:27  | American | Women    | other result

2012-10-13 08:15:27  | German   | Men      | here result

したがって、「query1」、「query2」、および「Result」は同じ値を持つことができるため、主キーまたは一意のフィールドを持つことはできません (たとえば、「American」(query1) と「Men」(query2) を含むより多くのフィールドを持つ複数のレコードを持つことができます)。そして異なる結果。

現時点では、PHPで使用しています:

INSERT INTO results (Timestamp, Query1, Query2, Result) VALUES ('$current_timestamp', '$nationality', '$gender', '')

すべてのレコードを追加して、巨大な DB を作成するだけです。しかし、私が達成したいのは、query1&query2&result の組み合わせ全体が存在しない場合にのみ、新しいレコードを追加することです。それ以外の場合は、「タイムスタンプ」フィールドを更新したいだけです。

たとえば、私の PHP スクリプトが次のデータを生成するとします。

Timestamp            | Query1   | Query2   | Result
2012-10-13 08:15:23  | American | Men      | result2

データベースにはすでに「American」&「Men」&「result2」の正確な組み合わせが含まれているため、フィールド「timestamp」だけが更新されます。それ以外の場合、組み合わせが異なる場合 (例: "American" "Men" "result3")、新しいレコードがテーブルに追加されます。

よろしくお願いいたします。

4

3 に答える 3

3

典型的な整数のような単一のPRIMARY KEY列がなくてもAUTO_INCREMENT、これらの 3 つの列が一意の組み合わせであることが意図されている場合は、それらを複合キーとして定義する必要があります。これにより、一意性が保持されるだけでなく、それらを 1 つの単位としてインデックスが作成されます。

CREATE TABLE results (
  `Timestamp` DATETIME NOT NULL,
  `Query1` VARCHAR() NOT NULL,
  `Query2` VARCHAR() NOT NULL,
  `Result` VARCHAR() NOT NULL,
  /* Composite key across three columns */
  PRIMARY KEY (`Query1`,`Query2`,`Result`)
);

when insert を使用ON DUPLICATE KEY UPDATEして、キー違反で挿入を中止し、代わりにタイムスタンプを更新することができます。

INSERT INTO results (
   Timestamp, 
   Query1, 
   Query2, 
   Result
) VALUES (
   '$current_timestamp', /* see note below about NOW() */
   '$nationality', 
   '$gender',
   ''
) ON DUPLICATE KEY UPDATE `Timestamp` = '$current_timestamp';

注: PHP 変数は既に適切にエスケープされていると想定しています。

注 2: の値$current_timestampが実際に現在のタイムスタンプであり、保存された値ではない場合NOW()、PHP 変数を渡すよりも MySQL の関数を使用することをお勧めします。

ON DUPLICATE KEY UPDATE `Timestamp` = NOW()

$current_timestampリストのについても同じことが言えVALUES()ます...

于 2012-10-13T13:43:50.527 に答える
0

次のような条件付き挿入を使用できます。

INSERT INTO results (Timestamp, Query1, Query2, Result) 
SELECT '$current_timestamp', '$nationality', '$gender', '$result'
    FROM DUAL
    WHERE NOT EXISTS (SELECT * FROM results
                         WHERE Query1 = '$nationality' 
                           AND Query2 = '$gender'
                           AND Result = '$result')

dualOracleで最初に導入された特別な1列の表です

ソース: http://en.wikipedia.org/wiki/DUAL_table

于 2012-10-13T13:47:15.827 に答える
0

次のように、「WHERE NOT EXISTS」句を使用できます。

INSERT INTO results (Timestamp, Query1, Query2, Result)
SELECT '$current_timestamp', '$nationality', '$gender', '$result'
FROM Dual
WHERE NOT EXISTS (SELECT * 
    FROM results 
    WHERE Query1 = '$nationality' 
    AND Query2 = '$gender'
    AND Result = '$result'
  )

ここで Dual は、クエリを構文的に正しくするためにのみ mysql で使用できるスタブ/フェイク テーブルです。

于 2012-10-13T13:47:52.803 に答える