mysql:从其他数据库添加数据,从特定行开始,用户id为主,需要插入从20开始的递增数字

nwsw7zdq  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(313)

我有一个19行的用户表(第一行是admin)。我需要添加更多,所以我有另一个数据库的表有超过140万用户。
我的表有一个“用户id”作为主键,int(11),没有自动递增。我需要添加从第20行开始的用户,并且只添加“名字”、“姓氏”和“电子邮件”。
我的第一次尝试:
insert into mydatabase.users(first\u name,last\u name,email)选择first\u name,last\u name,email from anotherdatabase.users
这会得到一个“字段'user\u id'没有默认值”。
我理解这是因为user\ id是主键,不能为空。所以,也是int(11),非自动递增。
所以我想加上20,21,22,23等等,还有其他的数据。我花了5个小时找了很多东西´似乎找不到我能理解的东西。
先谢谢你。

aurhwmvo

aurhwmvo1#

我找到了一个更简单的方法,使用变量。我还可以´我不敢相信。它起了很大的作用

SET @i=19;
INSERT INTO mydatabase.users(user_id, first_name, last_name, email) 
         SELECT @i:=@i+1,
         first_name, 
         last_name, 
         email 
FROM anotherdatabase.users;
vbopmzt1

vbopmzt12#

编写一个使用变量的过程。对于i<1400020,您需要计算另一个数据库中的行数。然后用户将数字加上20。

DELIMITER $$
CREATE PROCEDURE insert_test_data()
BEGIN
  DECLARE i INT DEFAULT 20;

  WHILE i < 1400020 DO
   INSERT INTO mydatabase.users (user_id, first_name, last_name, email) 
   SELECT i,first_name, last_name,  email  FROM anotherdatabase.users;
    SET i = i + 1;
  END WHILE;
END$$
DELIMITER ;
CALL insert_test_data();
DROP PROCEDURE insert_test_data;
4jb9z9bj

4jb9z9bj3#

要获得从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()'=当前行在其分区内的行数(mysql文档)'over()'-定义一个没有条件的分区;所以事实上整个table都很重要
关于这两个方面的详细信息可以在mysql窗口函数概念和语法下找到
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

这并不是假设您在另一个表上也有一个用户id。内部select只计算原始数据库中有多少条记录的id小于在该点返回的记录(并加上20以使编号从20开始)。
以及第三个选项(不取决于用户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;

我不太喜欢这个,因为它需要创建变量来跟踪行号。

相关问题