3

ここにテーブルがあります

CREATE TABLE IF NOT EXISTS kompas_url
(
    id  BIGINT(20) NOT NULL AUTO_INCREMENT,
    url VARCHAR(1000),
    created_date datetime,
    modified_date datetime,
    PRIMARY KEY(id)
)

URLがまだ存在しない場合にのみ、kompas_urlテーブルにINSERTを実行しようとしています

何か案が?

ありがとう

4

1 に答える 1

9

SELECTing by によって最初にそこにあるかどうかを調べるか、フィールドを一意urlにすることができます。url

CREATE TABLE IF NOT EXISTS kompas_url
    ...
    url VARCHAR(1000) UNIQUE,
    ...
)

これにより、MySQL が重複する行を挿入するのを停止しますが、挿入しようとするとエラーが報告されます。これはよくありません。エラーを処理することはできますが、他の人を偽装する可能性があります。これを回避するには、次のON DUPLICATE KEY UPDATE構文を使用します。

INSERT INTO kompas_url (url, created_date, modified_date)
VALUES ('http://example.com', NOW(), NOW())
ON DUPLICATE KEY UPDATE modified_date = NOW()

UPDATEこれにより、一意のフィールドで値が重複している場合にステートメントを提供できます (これには主キーを含めることができます)。この場合、おそらくmodified_date現在の日付でフィールドを更新する必要があります。

編集: ~unutbuで示唆されているように、複製で何も変更したくない場合は、INSERT IGNORE構文を使用できます。これは単純に次のように機能します。

INSERT IGNORE INTO kompas_url (url, created_date, modified_date)
VALUES ('http://example.com', NOW(), NOW())

これにより、特定の種類のエラーが警告に変わります。最も有用なのは、一意のエントリが重複していることを示すエラーです。ステートメントにキーワードIGNOREを配置しても、エラーは発生せず、クエリは単に削除されます。複雑なクエリでは、これにより役立つ可能性のある他のエラーも隠される可能性があるため、コードを使用する場合は、コードが正しいことを二重に確認することをお勧めします。

于 2010-04-02T01:18:13.473 に答える