0

これは何度も聞かれていることを知っており、ほとんどの質問を確認しましたが、私の問題に合った答えが見つかりませんでした.

私はテーブルを持っています:

CREATE TABLE `users` (                                   
      `Id` int(11) NOT NULL AUTO_INCREMENT,                  
      `Name` varchar(50) NOT NULL,                           
      `Email` varchar(50) NOT NULL,                                            
      `Added_Date` date DEFAULT NULL,                                             
      PRIMARY KEY (`Id`,`Email`)                             
    )

画面からこのテーブルにレコードを挿入し、ユーザーに友人の名前を尋ねNameますEmailId

私がやりたいことは、同じ電子メールIDがユーザーテーブルに存在する場合は、電子メールIDを確認してから、name入力したものを更新することです。それ以外の場合は、新しいレコードを挿入します。どちらの場合も、挿入または更新されたレコードの userId が必要です。

シンプルですね!

しかしReplace、試してみましたがInsert.. on duplicate key updateinsert where not existsどれもうまくいきませんでした。これは私がこれまでに試したことです:

交換

REPLACE INTO Users SET email = 'a@d.c';

ただし、nameチェックされていないため、これは毎回新しいレコードを挿入し続けます。正しく使用できているかどうかわかりません。

INSERT.. ON DUPLICATE KEY UPDATE

insert into Users (id, Name, Email, Added_date) values (null, 'ABCD', 'adb@di.co',current_date) on duplicate key update Name='XYZ';

テーブルの主キーは (id と emailid) の組み合わせであり、ID は自動増分であるため、毎回新しいレコードが挿入されるため、これは機能しません。

特定の email_id を持つレコードが存在するかどうかを確認するクエリを作成できることはわかっていupdateます。存在する場合は更新され、そうでない場合insertは新しいレコードになります。を使用して、インクリメントされた新しい ID を取得できます$userId = mysql_insert_id();。しかし、更新クエリの場合、どうすれば ID を取得できますか?

更新クエリと挿入クエリを別々に記述するよりも、このことを行うためのより良い方法が必要であると私は信じています。

4

2 に答える 2

2

主キーは、Users.Id のみに設定する必要があります。電子メールは一意にするだけです。

CREATE TABLE `users` (                                   
  `Id` int(11) NOT NULL AUTO_INCREMENT,                  
  `Name` varchar(50) NOT NULL,                           
  `Email` varchar(50) NOT NULL,                                            
  `Added_Date` date DEFAULT NULL,                                             
  PRIMARY KEY (Id),
  UNIQUE KEY Email (Email)                            
)

クエリはそのようになります。VALUES() 関数を使用して新しい値を取得できることに注意してください。

Insert into Users (Id, Name, Email, Added_date) 
values (null, 'ABCDe','adb@di.co',current_date) 
on duplicate key update Name=VALUES(Name);
于 2012-09-23T12:07:27.200 に答える
0

質問を最後まで読んでいませんでしたが、テーブル スキーマが正しくないと言えます。主キーは PRIMARY KEY ( Id) として定義する必要があり、メールは Email varchar(50) UNIQUE として定義する必要があります

于 2012-09-23T11:31:38.250 に答える