2

説明:

ユーザーの設定をデータベースに挿入しようとしています。ユーザーがまだ配置していない場合は、 が必要です。insertそれ以外の場合は、 が必要ですupdate。ユーザーの作成にデフォルト値を挿入して、を排他的に使用できることはわかっていますupdateが、それにより別のクエリが追加されます(と思います)

問題:

読み進めましたON DUPLICATE KEY UPDATEが、よくわかりません。これは私が持っているほぼ正確な質問ですが、答えはありません。答えは言う:

UNIQUE KEYまたはPRIMARY KEYとして定義された適切な列を持っている限り、あなたがやりたいことに対してうまくいくように聞こえます。

私がそのinsertように簡単にすると:

INSERT INTO table (color, size) VALUES ('blue', '18') ... 

それは でどのように生成されDUPLICATE KEYますか? mysql知る限り、それは単なる別の挿入であり、id自動インクリメントされます。テーブルの主キーを一意に設定していますが、それinsertに対してチェックするつもりはありませんよね?

テーブル:

CREATE TABLE `firm_pref` (
    `id` int(9) NOT NULL AUTO_INCREMENT,
    `firm_id` int(9) NOT NULL, //user_id in this case
    `header_title` varchar(99) NOT NULL,
    `statement` varchar(99) NOT NULL,
    `footer_content` varchar(99) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
4

2 に答える 2

4

アプリケーションを 1 人のユーザーのみに使用させたくない場合を除き、その中で誰かの user_id を指定する必要がありますINSERT- この「誰か」の男または女が自分の設定を更新するときですよね?

このフィールド ( user_id) は、まさにON DUPLICATE KEY UPDATE句によってチェックされるものです。

そして、新しいレコードを挿入したい場合は、NULL代わりに送信してください:

INSERT INTO table (user_id, color, size) VALUES (NULL, 'blue', 18);

...そのため、自動インクリメントは先に進み、その日を節約するチャンスがあります。)

更新:一部のフィールドを一意の識別子と見なす必要があることを理解するには、そのようにマークする必要があることに注意してください。このフィールドは として使用されるため、通常は自然に行われますPRIMARY KEY。しかし、それだけでは不十分な場合もあります。UNIQUEこれは、制約のための作業を意味します。たとえば、テーブルでは次のように使用できます。

CREATE TABLE `prefs` (
    `id` int(9) NOT NULL AUTO_INCREMENT,
    `firm_id` int(9) NOT NULL,
     ...
     PRIMARY KEY (`id`),
     UNIQUE KEY (`firm_id`)
);

(または、コマンドを使用して既存のテーブルにこの制約を追加できます ALTER TABLE prefs ADD UNIQUE (firm_id) )

次に、挿入/更新クエリは次のようになります...

INSERT INTO prefs(firm_id, header_title, statement, footer_content) 
           VALUES(17, 'blue', '18', 'some_footer')
 ON DUPLICATE KEY UPDATE 
           header_title = 'blue', 
           statement = '18', 
           footer_content = 'some_footer';

SQL Fiddle で一種のデモを作成しました。その概念をよりよく理解するために、もう少し遊んでみてください。)

于 2012-09-11T15:40:51.773 に答える
1

オプションの場合、通常options、使用可能なオプション (色、サイズなど) のリストを含むテーブルがあり、次に、テーブルとoptionsユーザーusersの値を含むテーブルの両方にまたがるテーブルがあります。

たとえば、あなたのoptionsテーブル:

id | name
=========
1  | color
2  | size

あなたのusersテーブル:

id | name
================
1  | Martin Bean

そしてoptions_users結合テーブル:

option_id | user_id | value
===========================
1         | 1       | Blue
2         | 1       | Large

テーブルに正しい外部キーが設定されてoptions_usersいれば、オプションまたはユーザーがシステムから削除されたときに、冗長な値を削除できます。また、ユーザーの設定を保存するときは、最初に以前の回答を削除して、新しい回答を挿入することができます。

DELETE FROM `options_users`
WHERE `user_id` = @user_id;

INSERT INTO `options_users` (`option_id`, `user_id`, `value`)
VALUES (1, @user_id, 'Blue'), (2, @user_id, 'Large');

それが役立つことを願っています。

于 2012-09-11T15:42:58.453 に答える