5

私が達成しようとしていることの明確化: 同じ電子メールで名前のないレコードがある場合は、「ユーザー名」を更新します。ユーザーがすでに名前を持っている場合は、何も変更しないでください

私は、すべてのユーザーが「購読者、起業家、または投資家」になることができる Web サイトを持っています。サブスクライバー (以前は電子メールのみを求めていた) がビジネス アイデアをアップロードすることを選択した場合、その人はおそらく以前と同じ電子メール アドレスを使用して、今回だけ名前を追加します。だから私は INSERT INTO をしたいのですが、電子メールがすでに存在する場合は名前を追加しますが、名前がまだない場合に限ります(他の人の詳細を簡単に上書きできないようにするため)。

私はここまで来ました:

 mysql_query("
     INSERT INTO users
         (email, name)
     VALUES
         ('" .$epost. "',  '" .$namn. "')
    ON DUPLICATE KEY UPDATE
    name=VALUES(name)   -->[if name == '', else do nothing...]
 ");

現在の名前が異なる場合は、新しい名前に置き換えます。

「フィールドが空の場合の重複更新時」を検索して見つけました: http://forums.aspfree.com/sql-development-6/on-duplicate-key-update-but-only-if-value-isn-t-482012 .html (マージ?)

重複キーの更新を条件とします(より近いですが、フィールドが空の場合にのみ、異なる場合は更新したくありません。)

http://bytes.com/topic/php/answers/914328-duplicate-key-update-only-null-values (入力が空白の場合..そうではありません)

http://boardreader.com/thread/Insert_on_duplicate_key_update_only_if_c_can8Xachr.html (このページのレイアウトに迷いました)

http://www.digimantra.com/tutorials/insert-update-single-mysql-query-duplicate-key/ (更新するだけです)

これは私が望んでいることのようなものかもしれないと思います(?)http://thewebfellas.com/blog/2010/1/18/conditional-duplicate-key-updates-with-mysqlそれは働く

このコード:

 mysql_query("UPDATE users SET name='".$namn."'
WHERE email='".$epost."' AND name =''");

以前はnullだった場合にのみ名前を更新し、それが私が求めているものですが、電子メールがまだ存在しない場合は新しいレコードを挿入しません

私のテーブル テーブル

だから私はこれを試しました:

  mysql_query("
     INSERT INTO users
     SELECT email, 'victoria' FROM users 
     WHERE email='victoria@hejsan.se' ON DUPLICATE KEY UPDATE name = 'victoria'
 ");

そして私はこれを試しました:

   mysql_query("
    INSERT INTO users
    SELECT email, 'yay' from users
    WHERE email='victoria@hejsan.se'
    ON DUPLICATE KEY
    UPDATE name = values(name)
 ");

@Fluffehの回答から

しかし、何も起こりません。私は答えを誤解しましたか?

誰かがすでにアカウントを持っている場合は、パスワードも既に持っているはずなので、パスワードを確認するように依頼し、電子メールを挿入して確認するときに AJAX 呼び出しを行うようにします。電子メールがすでに登録されている場合:)これはもはや問題ではなく、それが私が使用する解決策だと思います. !)

4

3 に答える 3

1

「exp1がnullでない場合はexp1を返し、exp1がnullの場合はexp2を返す」と定義された制御関数IFNULL(exp1、exp2)を使用して、このソリューションを提案したいと思います。

http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html

INSERT INTO users (name, email) VALUES ('$name','$email')
ON DUPLICATE KEY UPDATE name = IFNULL(name, VALUES(name))

もちろん、あなたは何とかこれを超えているに違いありませんが、それは私を助けました.

于 2016-05-06T03:23:20.617 に答える
1

If you want to update a field that is already exist, you can do this as;

-- MySQL Reference
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

-- so your code
INSERT INTO users
         (email, name)
     VALUES
         ('" .$epost. "',  '" .$namn. "')

     重複キー更新時 email=VALUES(email), name=VALUES(name)

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

アップデート

この時点で、「MySQL 条件付き挿入」が必要です。試してみよう;

CREATE TABLE IF NOT EXISTS `users` (
  `name` varchar(50) NOT NULL,
  `email` varchar(255) NOT NULL,
  UNIQUE KEY `email` (`email`)
)

INSERT INTO users (name, email) VALUES('kerem', 'qeremy[atta]gmail[dotta]com');
INSERT INTO users (name, email) VALUES('test', 'test@example.com');

>> 2 行挿入されました。(クエリには 0.0005 秒かかりました)

-- これはあなたの役割です (メール フィールドは一意であるため、WHERE email='search email')

INSERT INTO ユーザー (名前、電子メール)
    存在しない DUAL から 'test', 'test@example.com' を選択 (
        SELECT * FROM users WHERE email = 'test@example.com' LIMIT 1
    );

>> 0 rows inserted. ( Query took 0.0003 sec )

https://www.google.com/search?q=conditional+insert+mysql

http://allurcode.com/2011/04/15/mysql-conditional-insert/ (which is useful search result)

UPDATE 2

If this does not work for you, then you can do your work like (just an input);

mysql_query("INSERT IGNORE INTO users (name, email) VALUES('$name', '$email')");
if (!mysql_insert_id()) {
   mysql_query("UPDATE users SET name='$name' WHERE name='' AND email='$email'");
}

Or;

mysql_query("UPDATE users SET name='$name' WHERE name='' AND email='$email'");
if (mysql_affected_rows() < 1) {
   mysql_query("INSERT INTO users (name, email) VALUES('$name', '$email')");
}
于 2012-08-07T08:58:52.880 に答える
1

insert .... on duplicate key...問題を解決するために構文を使用できる唯一の方法は、 ifnameemail複合キーを作成することです。主キーとして auto_increment を使用する方がよいと思います。

PHP に少しロジックを入れて、最初にチェックを行い、次に挿入または更新する必要があるかもしれません。または、同じテストを行う関数を作成する必要がありますが、どちらも単純なクエリではありません。

編集:これがあなたのやりたいことかどうかはわかりませんが、あなたの要件に対する最善の解決策は、実際に1対多の関係で2つのテーブルを使用することだと思います.

Table-Users
id | email | name

create table users(
    id int(10) not null auto_increment,
    email varchar(100),
    name varchar(100),
    primary key(email, name)
    );

Table-Ideas
id | userID | idea

create table users(
    id int(10) not null auto_increment primary key,
    userID int(10) not null,
    idea text
    );

主キーがテーブルにあれば、上書きinsert... duplicate...を心配することなく安全に実行できます。ただし、2 番目のテーブルでは、アイデアを安全に保存してユーザーにロックすることができ、ユーザーごとに多数のアイデアを持つことができます。関係はusers.idtoであるideas.userIDため、詳細が更新されても所有者を失うことはありません。

編集:(別名、ZOMG facepalm

$query="
    update users 
        set name='".$userName."' 
    where 
        email='".$userEmail."' 
        and name is null";

編集2:(別名、眉を拭く

insert into users 
    select email, '".$namn."' from users where email='".$epost."' 
    on duplicate key 
        update name = values (name);

そしてここでそれは働いています:

mysql> create table test1 (myName varchar(10) unique, myEmail varchar(10));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test1 values ('Tom','something');
Query OK, 1 row affected (0.01 sec)

mysql> insert into test1 values('Nick',null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test1;
+--------+-----------+
| myName | myEmail   |
+--------+-----------+
| Tom    | something |
| Nick   | NULL      |
+--------+-----------+
2 rows in set (0.00 sec)

mysql> insert into test1 select myName, myEmail from test1 
where myName='Tom' on duplicate key update myEmail = values (myEmail);
Query OK, 0 rows affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from test1;
+--------+-----------+
| myName | myEmail   |
+--------+-----------+
| Tom    | something |
| Nick   | NULL      |
+--------+-----------+
2 rows in set (0.00 sec)

mysql> insert into test1 select 'Tom', myEmail from test1 
where myName='Tom' on duplicate key update myEmail = values (myEmail);
Query OK, 0 rows affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from test1;
+--------+-----------+
| myName | myEmail   |
+--------+-----------+
| Tom    | something |
| Nick   | NULL      |
+--------+-----------+
2 rows in set (0.00 sec)

mysql> insert into test1 select myName, 'Something Else' from test1 
where myName='Tom' on duplicate key update myEmail = values (myEmail);
Query OK, 2 rows affected, 1 warning (0.01 sec)
Records: 1  Duplicates: 1  Warnings: 1

mysql> select * from test1;
+--------+------------+
| myName | myEmail    |
+--------+------------+
| Tom    | Something  |
| Nick   | NULL       |
+--------+------------+
2 rows in set (0.00 sec)

mysql> insert into test1 select myName, null from test1 
where myName='Nick' on duplicate key update myEmail = values (myEmail);
Query OK, 0 rows affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from test1;
+--------+------------+
| myName | myEmail    |
+--------+------------+
| Tom    | Something  |
| Nick   | NULL       |
+--------+------------+
2 rows in set (0.00 sec)

mysql> insert into test1 select myName, 'yay' from test1 
where myName='Nick' on duplicate key update myEmail = values (myEmail);
Query OK, 2 rows affected (0.01 sec)
Records: 1  Duplicates: 1  Warnings: 0

mysql> select * from test1;
+--------+------------+
| myName | myEmail    |
+--------+------------+
| Tom    | Something  |
| Nick   | yay        |
+--------+------------+
2 rows in set (0.00 sec)

編集3:これを試してみてください$query

insert into table1 select coalesce(email,'".$epost."') as email, coalesce(name,'".$namn."') as name from table1 
where email='".$epost."' on duplicate key update name = values (name);
于 2012-08-06T23:36:20.520 に答える