質問
私はPHPで働いています。
一意のフィールドを持つDBに新しいレコードを挿入する適切な方法を教えてください。 バッチで大量のレコードを挿入していますが、新しいレコードを挿入したいだけで、重複したエントリのエラーは必要ありません。
最初にSELECTを作成し、INSERTの前にエントリが既に存在するかどうかを確認する方法はありますか?SELECTがレコードを返さない場合にのみ挿入する方法はありますか?しないことを願っています。
エラーなしでこれらの挿入を無視するようにMySQLに何らかの形で伝えたいと思います。
ありがとう
解決
次の場合、 INSERT ... IGNORE 構文を使用できます。重複するレコードがある場合は何もしません。
REPLACE INTO 構文を使用できます同じキーを持つ新しいレコードで古いレコードを上書きします。
または、 INSERT ... ONを使用できます。重複が発生した場合にレコードの更新を実行する場合は、DUPLICATE KEY UPDATE 構文。
編集:いくつかの例を追加すると思いました。
例
id
と value
の2つの列を持つ tbl
という名前のテーブルがあるとします。 1つのエントリ、id = 1およびvalue = 1があります。次のステートメントを実行する場合:
REPLACE INTO tbl VALUES(1,50);
id = 1 value = 50のレコードがまだ1つあります。ただし、最初にレコード全体が削除されてから再挿入されたことに注意してください。次に:
INSERT IGNORE INTO tbl VALUES (1,10);
操作は正常に実行されますが、何も挿入されません。まだid = 1とvalue = 50があります。最後に:
INSERT INTO tbl VALUES (1,200) ON DUPLICATE KEY UPDATE value=200;
id = 1およびvalue = 200の単一のレコードが作成されました。
他のヒント
トリガーを使用できます。
トリガーの概要ガイドも確認してください。
データベーススキーマはどのように見えますか?
autoとなるID列を追加できます。挿入ごとにインクリメントして、一意の行を保証します。
質問:クライアントでデータベースをセットアップしています。 「挿入」を使用することを知っていますデータベースに情報を挿入するステートメントですが、同じクライアント情報を再度入力しないようにするにはどうすればよいですか?
回答:EXISTS条件を使用して、重複した情報を挿入しないようにすることができます。
たとえば、client_idの主キーを持つclientsという名前のテーブルがある場合、次のステートメントを使用できます。
INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);
このステートメントは、副選択で複数のレコードを挿入します。
単一のレコードを挿入する場合は、次のステートメントを使用できます。
INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);
デュアルテーブルを使用すると、値が現在テーブルに保存されていない場合でも、selectステートメントに値を入力できます。
一意の制約なしで、重複するテーブル(できれば一時テーブル)を作成してみて、そのテーブルに一括読み込みを行います。次に、一時テーブルから一意の(DISTINCT)アイテムのみを選択し、ターゲットテーブルに挿入します。
$duplicate_query=mysql_query("SELECT * FROM student") or die(mysql_error());
$duplicate=mysql_num_rows($duplicate_query);
if($duplicate==0)
{
while($value=mysql_fetch_array($duplicate_query)
{
if(($value['name']==$name)&& ($value['email']==$email)&& ($value['mobile']==$mobile)&& ($value['resume']==$resume))
{
echo $query="INSERT INTO student(name,email,mobile,resume)VALUES('$name','$email','$mobile','$resume')";
$res=mysql_query($query);
if($query)
{
echo "Success";
}
else
{
echo "Error";
}
else
{
echo "Duplicate Entry";
}
}
}
}
else
{
echo "Records Already Exixts";
}