Ali*_*sso 5 php mysql insert-into
澄清我想要完成的任务: 更新"用户名",如果有相同电子邮件但没有名称的记录.如果用户已有名称,则不要进行任何更改
我有一个网站,所有用户都可以成为"订阅者,企业家或投资者".如果订阅者(我以前只是要求他们发送电子邮件)选择上传商业创意,那么该人可能会使用与之前相同的电子邮件地址,只需添加一个名称.所以我想插入到,如果电子邮件已经存在 - 添加名称,但前提是不存在的名称已经存在(这样的人不能简单地写上别人的详细信息).
我到目前为止:
mysql_query("
INSERT INTO users
(email, name)
VALUES
('" .$epost. "', '" .$namn. "')
ON DUPLICATE KEY UPDATE
name=VALUES(name) -->[if name == '', else do nothing...]
");
Run Code Online (Sandbox Code Playgroud)
现在,如果不同,它会用新的名称替换当前名称.
我搜索"重复更新如果字段为空"并找到: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 =''");
Run Code Online (Sandbox Code Playgroud)
更新名称,只有它之前为空,这就是我所追求的,但是如果电子邮件尚不存在则不会插入新记录.
我的桌子

所以我尝试了这个:
mysql_query("
INSERT INTO users
SELECT email, 'victoria' FROM users
WHERE email='victoria@hejsan.se' ON DUPLICATE KEY UPDATE name = 'victoria'
");
Run Code Online (Sandbox Code Playgroud)
我试过这个:
mysql_query("
INSERT INTO users
SELECT email, 'yay' from users
WHERE email='victoria@hejsan.se'
ON DUPLICATE KEY
UPDATE name = values(name)
");
Run Code Online (Sandbox Code Playgroud)
来自@Fluffeh的回答
但没有任何反应.我误解了答案吗?
它只是打击了我,如果有人已经有一个帐户,那么他们也应该有一个密码,所以我只是要求他们验证他们的密码,并确保我们插入他们的电子邮件时进行AJAX调用,看看如果电子邮件已经注册了:)那么这不再是一个问题,我认为这是我将采用的解决方案.!)
您可以使用语法来解决问题的唯一方法insert .... on duplicate key...是 ifname并email制作一个复合键 - 我认为您最好使用 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
);
Run Code Online (Sandbox Code Playgroud)
有了表上的主键,您就可以安全地执行操作,insert... duplicate...而不必担心过度写入。然而,第二个表将允许您安全地锁定用户存储的想法,并让您为每个用户提供许多想法。由于关系是users.id给ideas.userID你的,所以即使更新了他们的详细信息,你也不会失去它的所有者。
编辑:(又名 ZOMG捂脸)
$query="
update users
set name='".$userName."'
where
email='".$userEmail."'
and name is null";
Run Code Online (Sandbox Code Playgroud)
编辑2:(又名,擦眉毛)
insert into users
select email, '".$namn."' from users where email='".$epost."'
on duplicate key
update name = values (name);
Run Code Online (Sandbox Code Playgroud)
它在这里工作:
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)
Run Code Online (Sandbox Code Playgroud)
编辑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);
Run Code Online (Sandbox Code Playgroud)