1

他の誰かが作成したプログラムから、貧弱なデータベース構造に対処しようとしていることに気づき、それに対処するためにクエリを作成しようとしています。既知の一意/主キーがない upsert クエリをシミュレートしようとしています...

DELIMITER //
IF ( ( SELECT COUNT( f_id ) FROM `wp_cformsdata` WHERE field_name='Agent First Name' AND sub_id='395' ) > 0 ) THEN
    UPDATE `wp_cformsdata` SET field_val='Shane' WHERE field_name='Agent First Name' AND sub_id='395';
ELSE
INSERT INTO `wp_cformsdata` (sub_id, field_name, field_val) VALUES ( '395', 'Agent First Name', 'Shane' );
END IF;
DELIMITER ;

基本的に私のテーブルレイアウトは次のとおりです...

+------+--------+------------+-----------+
| f_id | sub_id | field_name | field_val |
+------+--------+------------+-----------+

このテーブルは、企業に関する個々のデータを格納するために使用されます。

'f_id' は、このテーブルで唯一のインデックス キー (プライマリ) です。それが値であるかどうか、またはデータを含むキーが存在するかどうかさえわかりません。

「sub_id」は、各会社のエントリに含まれる別のテーブルへの外部キーです。

'field_name' は、会社に関する情報の名前です (例: Company Name)

「field_val」はフィールドの実際の値です (例: Google Inc.)

これらのテーブルのデータを更新しようとしている、またはデータが存在しない場所に挿入しようとしています。このテーブルの性質上、どのフィールドにもインデックスを作成できません。上記の SQL を参照して、私が何をしているのかを確認してください。はい、少し肥大化しています。他に最適解があれば教えてください!

upsert クエリを試してみましたINSERT ... ON DUPLICATE KEY UPDATEが、ここで作業するための一意のキーまたは主キーがないため、これは機能しません。

4

1 に答える 1

1

実際に(sub_id, field_name)は複合キーとして扱います。f_id自動インクリメント列だと思いますか?その場合、一意の制約を次のように定義できます(sub_id, field_name)

ALTER TABLE wp_cformsdata ADD UNIQUE mykey (sub_id, field_name)

次に、重複する主キーがある場合だけでなく、他の一意キー制約に違反している場合にも句INSERT ... ON DUPLICATE KEY UPDATEを実行する which を使用します。ここUPDATEで受け入れられた回答のコメントも参照してください。

于 2012-10-08T09:21:46.130 に答える