2010-12-03 17 views
1

私のテーブルの構造は次のとおりです。MySQLの主キーが... DUPLICATE KEY UPDATE ON

CREATE TABLE IF NOT EXISTS `users_settings_temp` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `userid` int(10) unsigned DEFAULT NULL, 
    `type` enum('type1','type2') 
    `data` text, 
    `date_created` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

私は何をしようとしていることである:

レッツは、私は新しいエントリを挿入したいと言いますGoogleは周りに、私はこのフォーマットを見つけた後、私は、それは重複になりたいいけない:

INSERT INTO users_settings_temp(...) 
ON DUPLICATE KEY UPDATE data = '{$data}' 

私は、問題は、私のテーブルの主キー=>idだと思います。

INSERT INTO ... ON DUPLICATE KEY UPDATE 

user_id + typeを主キーとして使用できますか?はいの場合は、どうすればいいか教えてください。

+0

正確に複製したいのですか?それを捨てる?データを何かに変更しますか? –

+0

ご迷惑をおかけして申し訳ございません。その重複したときに更新したい。私はまもなく私の質問を更新します。 –

+0

主キー(ユーザーID、型) –

答えて

5
その後、
CREATE TABLE IF NOT EXISTS `users_settings_temp` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `userid` int(10) unsigned DEFAULT NULL, 
    `type` enum('type1','type2'), 
    `data` text, 
    `date_created` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`, `type`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

あなたはこのようにそれを行う

a)に特定するIDは

mysql> INSERT INTO users_settings_temp VALUES (1, 2, 'type1', 'keks', 5); 
Query OK, 1 row affected (0.00 sec) 

mysql> INSERT INTO users_settings_temp VALUES (1, 2, 'type2', 'keks', 5); 
Query OK, 1 row affected (0.00 sec) 

Bを作品)の進路主キーはユニーク

mysql> INSERT INTO users_settings_temp VALUES (1, 2, 'type2', 'keks', 5); 
ERROR 1062 (23000): Duplicate entry '1-type2' for key 'PRIMARY' 

Cであることが保証されます)データベースに新しいIDをプルさせることができます

mysql> INSERT INTO users_settings_temp VALUES (NULL, 2, 'type2', 'keks', 5); 
Query OK, 1 row affected (0.00 sec) 

mysql> INSERT INTO users_settings_temp VALUES (NULL, 2, 'type1', 'keks', 5); 
Query OK, 1 row affected (0.00 sec) 

が、常に

mysql> SELECT * FROM users_settings_temp; 
+----+--------+-------+------+--------------+ 
| id | userid | type | data | date_created | 
+----+--------+-------+------+--------------+ 
| 1 |  2 | type1 | keks |   5 | 
| 1 |  2 | type2 | keks |   5 | 
| 2 |  2 | type2 | keks |   5 | 
| 3 |  2 | type1 | keks |   5 | 
+----+--------+-------+------+--------------+ 
4 rows in set (0.00 sec) 

NOTESそれらを増加します:

あなたidはまだ自動インクリメントするかどうあなたが考えなければなりません。 また、date_createdがの代わりにdatetimeの代わりになる理由を考えることができません

+0

strtotime()を使用して時刻を秒に変換し、データベースに格納します。私はインターネット上のいくつかのチュートリアルに従います。それが良いのかどうかわからない。 –

+0

@ webdev_007、そうではありませんが、それほど単純ではありません。データベースのドメイン/タイプを決定することで、アプリケーションのコード(すべてのアプリケーションコード、すべてのデータベースコード、クエリ、フォーマット、変換など) );したがって、それを正しく得ることは良いことです。ルールはそれほど簡単ではありませんが、通常は自然な型、日付は日付、金額は小数点などが必要です。 (また、あなたが有用な答えを見つけたら、それを受け入れるだけでなく、それをアップヴォートすることもできます) – Unreason

関連する問題