5

澄清我要完成的工作: 如果有记录具有相同的电子邮件但没有名称,则更新“用户名”。如果用户已有名称,则不要进行任何更改

我有一个网站,所有用户都可以是“订阅者、企业家或投资者”。如果订阅者(我之前只要求提供电子邮件)选择上传商业创意,那么该人可能会使用与以前相同的电子邮件地址,只是这次添加了一个名称。所以我想插入,如果电子邮件已经存在 - 添加名称,但前提是那里已经没有名称(这样一个人不能简单地覆盖别人的详细信息)。

我已经做到了这一点:

 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 =''");

仅当名称以前为空时才更新名称,这就是我所追求的,但是如果电子邮件尚不存在,则它不会插入新记录。

我的桌子 桌子

所以我尝试了这个:

  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

insert .... on duplicate key...您可以使用语法来解决您的问题的唯一方法是 ifnameemail制作一个复合键 - 我认为您最好使用 auto_increment 作为主键。

您可能需要在 PHP 中添加一些逻辑来首先进行检查,然后插入或更新 - 或编写一个函数来为您执行相同的测试 - 但两者都不是您可以触发的简单查询。

编辑:不确定这是否是您想要做的,但我认为满足您要求的最佳解决方案是在一对多关系中实际使用两个表。

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...而不必担心覆盖人员。但是,第二个表将允许您将想法安全地存储给用户,并让您拥有每个用户的多个想法。由于关系users.idideas.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 回答
1

如果你想更新一个已经存在的字段,你可以这样做;

-- MySQL 参考
插入表 (a,b,c) 值 (1,2,3),(4,5,6)
  重复键更新 c=VALUES(a)+VALUES(b);

- 所以你的代码
插入用户
         (电子邮件,姓名)
     价值观
         ('" .$epost."', '" .$namn."')

     ON DUPLICATE KEY UPDATE email=VALUES(email), name=VALUES(name)

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

更新

此时,您需要“MySQL 条件插入”。让我们试试吧;

如果不存在“用户”,则创建表(
  `name` varchar(50) NOT NULL,
  `email` varchar(255) NOT NULL,
  唯一键 `email` (`email`)
)

插入用户(姓名,电子邮件)值('kerem','qeremy[atta]gmail[dotta]com');
插入用户(姓名、电子邮件) VALUES('test', 'test@example.com');

>> 插入 2 行。(查询耗时 0.0005 秒)

-- 这是你的部分(关于电子邮件字段是唯一的,所以 WHERE email='search email')

插入用户(姓名、电子邮件)
    SELECT 'test', 'test@example.com' FROM DUAL WHERE NOT EXISTS (
        SELECT * FROM users WHERE email = 'test@example.com' LIMIT 1
    );

>> 已插入 0 行。(查询耗时 0.0003 秒)

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

http://allurcode.com/2011/04/15/mysql-conditional-insert/(这是有用的搜索结果)

更新 2

如果这对您不起作用,那么您可以像(只是输入)一样完成您的工作;

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

或者;

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

我想建议这个解决方案使用控制函数 IFNULL(exp1,exp2),定义为“如果 exp1 不为空,则返回 exp1;如果 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 回答