2012-01-24 38 views
2

我有表:更新数据库替换为INTO

select * from person; 

+----+------+---------+ 
| id | name | surname | 
+----+------+---------+ 
| 1 | John | Doe  | 
| 2 | Mary | Smith | 
+----+------+---------+ 
2 rows in set (0.00 sec) 

我需要在MySQL数据库中,以取代值。所有的值都有相同的ID,所以我试图:

replace into person (id,name) values (1,'Victor'); 

select * from person; 
+----+--------+---------+ 
| id | name | surname | 
+----+--------+---------+ 
| 1 | Victor | NULL | 
| 2 | Mary | Smith | 
+----+--------+---------+ 
2 rows in set (0.00 sec) 

问题是它的姓氏设置为NULL。

我知道我可以用UPDATE person SET name='Victor' WHERE id=1做到这一点,但是我有一个包含许多INSERT INTO的转储的巨大SQL文件,所以我在考虑使用REPLACE INTO,因为它具有相同的语法结构,它会更快,只是做搜索&替换(INSERT - > REPLACE INTO)。

编辑: 问题是我有一个巨大的转储文件是这样的:

INSERT INTO person (id,name) VALUES (1,'Victor'); 
INSERT INTO person (id,name) VALUES (2,'Mark'); 
INSERT INTO person (id,name) VALUES (3,'Steve'); 
INSERT INTO person (id,name) VALUES (4,'Lou'); 
INSERT INTO person (id,name) VALUES (5,'Jessica'); 

等。

所以I'm希望更新所有那些名字到最简单的方法数据库。如果我能做这样的事情会很棒:UPDATE person SET (id,name) VALUES (1,´Victor')

回答

1

理想情况下,你会使用这样的:

INSERT INTO person (id, name) values ('1', 'Victor') 
ON DUPLICATE KEY UPDATE name = 'Victor'; 

原因REPLACE INTO没有达到你想要的结果,是因为REPLACE INTO,在功能方面,删除了该行,并重新插入它与数据你提供。

如果您的数据库转储包含数据库中已存在的所有信息以及更新的信息,那么最好只是删除表并在干净的数据库上运行导入。如果数据库中存储的数据不包含在转储中,那么导入过于钝的工具可以使用。

可能在每个语句结束时都有运气重击ON DUPLICATE KEY UPDATE name = 'foo';

+0

数据库转储不包含所有信息,只是id和新名称。 –

0

REPLACE是SQL标准的MySQL扩展。它要么插入,要么删除,插入。

http://dev.mysql.com/doc/refman/5.0/en/replace.html

所以它是没有得到传递给姓的值。你可以尝试

replace into person (id,name,surname) 
values (1,'Victor',(select surname from person where id=1)); 

但这并没有比创建更新语句更简单,我不确定它会工作。