首页 > 解决方案 > MySQL:从另一个数据库添加数据,从特定行开始,user_id 是主要的,需要插入从 20 开始的递增数字

问题描述

我有一个 19 行的用户表(第一行是管理员)。我需要添加更多,所以我有另一个数据库,其中的表有超过 1.400.000 个用户。

我的表有一个“user_id”作为主键,INT(11),没有自动增量。我需要从第 20 行开始添加用户,并且只有“first_name”、“last_name”和“email”。

我的第一次尝试:

INSERT INTO mydatabase.users (first_name, last_name, email) SELECT first_name, last_name, email FROM anotherdatabase.users

这让我得到一个“字段'user_id'没有默认值”

我理解这是因为 user_id 是主键并且不能为空。所以,同样,它是 int(11),非自增。

所以我想在其他数据中添加 20、21、22、23 等等。我搜索了大约 5 个小时,似乎找不到任何我能理解的东西。

先感谢您。

标签: mysqlinsertrowincrement

解决方案


要获取从 20 开始的数字:

INSERT INTO mydatabase.users (user_id, first_name, last_name, email) 
  SELECT 19+row_number() over (),
         first_name, 
         last_name, 
         email 
  FROM anotherdatabase.users

19+row_number() over ()
'row_number()' = 其分区内的当前行数(Mysql文档)'over()' - 定义一个无条件的分区;所以实际上对整个桌子都很重要

两者的详细信息可以在MySQL Window Function 概念和语法
19+ - ...

或者 - 如果 MySQL 版本 < 8.0:

INSERT INTO mydatabase.users (user_id, first_name, last_name, email) 
  SELECT (select 20+count(*) 
          from  anotherdatabase.users u1 where u1.id < u.id) as id,
         first_name, 
         last_name, 
         email 
  FROM anotherdatabase.users u

这确实假设您在另一个表上也有一个 user_id。内部选择仅计算原始数据库中有多少记录的 id 小于当时返回的记录(并添加 20 以使编号从 20 开始)。

第三个选项(不取决于 user_id 的存在):

INSERT INTO mydatabase.users (user_id, first_name, last_name, email) 
  SELECT ( @row_num:=@row_num+1 AS user_id,
         first_name, 
         last_name, 
         email 
  FROM anotherdatabase.users u,
       (SELECT @row_num:=19) var;

我不是这个的忠实粉丝,因为它涉及创建变量来跟踪行号。


推荐阅读