【问题标题】:insert/update mysql column based on existing data根据现有数据插入/更新 mysql 列
【发布时间】:2016-09-09 15:03:56
【问题描述】:

我正在通过将数据添加到现有列中来更新现有表。

我已经有要插入的数据的输出,但是由于记录的数量,我正在寻找将其插入到我的表中的最佳方法,而无需手动写入每行 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

所以我想将第二项插入到第一项 = id 的“dob”列中

是否可以通过编程方式执行此操作,或者我必须为每一行编写 WHERE 和 OR 语句?

【问题讨论】:

  • 不可能。 insert 创建新记录。如果你想定位一个已经存在的记录,你必须update。您可能能够使用insert ... on duplicate key update-type 的东西,但由于您没有提供有关表定义的详细信息,所以这不是肯定的。
  • 谢谢@MarcB - 我认为这将是一个更新,但希望会有某种我以前没有听说过的块更新命令
  • 不。多值语法是特定于insert 的mysql 扩展。更新查询没有等价物。
  • 感谢@MarcB 的快速回复-我最好继续我的查找和替换,干杯

标签: mysql sql-server sql-update


【解决方案1】:

您在帖子中同时标记了 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]

【讨论】:

  • 感谢您的回答(我指的是 MySQL 仅供参考 - 我对 Miss 标签的错误)。两个答案都解决了问题,并在 5 分钟而不是 2 小时内完成了更新
  • 好东西!泰勒的回答比我的要深入得多——很高兴你把它整理好了。
【解决方案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 您的临时表,一切顺利 - 祝您好运!

重要

更新数据时要格外小心 - 很容易因为忘记添加子句而弄乱数据。如果可能,请先使用一些测试数据进行此操作,然后再使用实际生产数据进行尝试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2016-06-21
    • 2018-03-25
    • 2015-02-06
    相关资源
    最近更新 更多