我通过将数据添加到现有列来更新现有表。
我已经有了要插入的数据的输出,但是由于记录的数量,我正在寻找将其插入到我的表中的最佳方法,而无需手动写入每行的sql
这是我想要插入
的sql(部分)INSERT INTO `tbl_user_variables_dobRE` (`user_id`, `value`) VALUES
(150, '1959-11-02'),
(151, '1948-04-20'),
(152, '1961-06-18'),
这是我要将其插入
的表格id | 7
username | guestinvite
password | BLANK
forname | forname
surname | surname
email | guestinvite@test.com
address_id | 286
type_id | 4
dob | 0000-00-00
plusGuest | 0
update | 2016-02-16 11:54:36
created | 2016-04-04 17:03:12
所以我想将第二项插入' dob'第一项= id
的列无论如何以编程方式执行此操作或者我必须编写WHERE&每行的OR语句?
答案 0 :(得分:2)
我能想到的最快捷的方法是创建一个包含您要添加的新数据的临时表(您可以从CSV文件批量导入所有数据)。
临时表只需要几列 - 一列user_id
而另一列dob
- 您无论如何都会摆脱它。
然后你可以这样做:
UPDATE tbl_user_variables_dobRE a
JOIN tmp_table b
ON ( a.user_id = b.user_id )
SET a.dob = b.dob
一旦你做完了,你可以DROP
你的临时桌子并且好好去 - 祝你好运!
重要强>
更新数据时要格外小心 - 忘记添加条款会让您的数据变得如此容易。如果可能的话,在使用实际生产数据进行测试之前,请先使用一些测试数据。
答案 1 :(得分:2)
您在帖子中标记了MySql和sql-server。以下假设您使用的是SQL Server,但这个想法在MySQL中保持不变(只是语法不同)......
如果我理解正确,听起来你想做UPDATE
,而不是INSERT
,因为你正在修改现有的行。
您说您有要插入的数据的输出 - 将其插入TEMP表并将其加入到您想要更新ID匹配位置的表中。
BEGIN TRANSACTION [Transaction1] -- Do large updates as transactions to avoid data loss
CREATE TABLE #temp ( -- Create temp table
[user_id] int,
[dob] nvarchar(20)
)
INSERT INTO #temp
-- YOUR SELECT GOES HERE
SELECT my_id as [user_id], my_dob as [dob]
UPDATE my_table
SET my_table.dob = t.dob
FROM tbl_user_variables_dobRE my_table
INNER JOIN #temp t ON t.user_id = my_table.id
DROP TABLE #temp
如果您的数据看起来不错,请提交交易:(不要停留太长时间,事务锁定表数据!)
COMMIT TRANSACTION [Transaction1]
,否则:强>
ROLLBACK TRANSACTION [Transaction1]