2011-03-31 142 views
0

当前有一些数据输入错误,我基本上需要运行一个模式,它更新当前记录并插入一个新的(如果可能,在一个语句中)。该表被设置为这样:MySQL更新和插入语句

cityID   int(10) 
    stateID   smallint(5) 
    orderEnterpriseID int(10) 
    isDefault   tinyint(3) 
    locationType  tinying(2) 

现在,每一个记录有0的locationType,我需要将其更新为5:

UPDATE
table SET
tablelocationType = 5其中tablelocationType = 0 AND tableorderFromEnterprise = 0;

但我还需要创建另一个重复数据的记录,并将locationType设置为6.我有问题围绕着这些SQL语句中的一些,并且非常感谢任何帮助!

+0

为什么不在2中进行?首先插入,然后更新? – Wrikken 2011-03-31 19:11:05

+0

在哪里创建重复记录?在同一张桌子里? – 2011-03-31 19:11:22

+1

我认为你真正想要的是一个交易,而不是一个单一的陈述。你不能作为一个声明来做到这一点。 – 2011-03-31 19:29:50

回答

1

首先,你已经说明执行更新:

UPDATE 
table SET 
table.locationType = 5 WHERE table.locationType = 0 AND table.orderFromEnterprise = 0; 

然后复制所有记录,并将它们分配一个6的位置,类型上插入,记得的locationType = 5限制的记录,以确保新添加的记录不会被复制,以及(不知道如果多数民众赞成甚至与MySQL的问题,但只是要确定):

INSERT INTO table 
(cityID, stateID, orderEnterpriseID, isDefault, locationType) 
SELECT t1.cityID, t1.stateID, t1.orderEnterpriseID, t1.isDefault, 6 
FROM table as t1 
WHERE t1.locationType = 5 

它不是在一个声明,但它会完成这项工作,如果你担心关于不一致的话只是换一个交易围绕两个操作

1

你不能在UPDATE语句内做到这一点,只更新已经在表中的内容。如果你想复制条目改变一个领域,你可以做以下

INSERT table_name (cityID, stateID , orderEnterpriseID, isDefault, locationType) 
SELECT cityID, stateID , orderEnterpriseID, isDefault, 6 
FROM table_name 

(请注意,所有这一切都是因为一个语句执行) 还指出,我们选择而不是表格中的locationType。

我们在这里所做的只是选择从表格中替换位置类型到6的所有内容,并将其插入到表格中。

+0

我会建议使用where子句来限制select,以摆脱自从将行插入同一个表之后可能出现的任何混淆,不确定服务器将执行什么操作,但实际上我会期望它将继续应对新插入的行好吧,但查询执行可能已经完成,当插入开始时,不知道如何MySQL处理,因此它更好地限制选择;) – ntziolis 2011-03-31 19:24:45

+0

我已经检查它之前张贴在这里,一切正常,因为它应该。如果这种竞争条件成为可能,那么这些类型的语句根本就不存在于sql中。我甚至不确定它是否完全可能通过发出一个SQL查询来创建竞争条件。 – 2011-03-31 19:29:12

+0

不是说它没有,只是宁愿总是在安全的一面;) – ntziolis 2011-03-31 19:32:41

1

我不认为这是可以做到这一点在一个单一的查询。但是,您可以插入locationType设置为6的重复行,然后更新0到5的位置类型。以下是查询:

insert into table (cityID, stateID, orderEnterpriseID, isDefault, locationType) 
select cityID, stateID, orderEnterpriseID, isDefault, 6 
from table 
where locationType = 0 and orderEnterpriseID = 0; 

# now your update query 
update table 
set locationType = 5 
where locationType = 0 and orderEnterpriseID = 0;