mysql - 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 个小时,似乎找不到任何我能理解的东西。
先感谢您。
解决方案
要获取从 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;
我不是这个的忠实粉丝,因为它涉及创建变量来跟踪行号。
推荐阅读
- javascript - 如何在 asp.net 中使用 XMLHttpRequest 从带有 Post 方法的页面获取响应文本?
- sql - mssql cdc update_mask 过滤器更改仅在列 TS
- uipath - 构建数据表错误(无法读取数据表)
- php - 邮件程序错误:邮件正文为空,需要在正文中没有更改的情况下发送邮件
- python - 这是解决 Spacekings 问题的正确方法吗?
- c# - 如何在 C# 中拯救 null?
- java - com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造实例
- git - 这个 git rebase 步骤两个 git 分支是否正确?
- javascript - 如何在使用lineseries制作的线条上方对齐uielement文本框
- selenium - selenium WebDriverWait.Untils NoSuchMethodError