在现有表格的基础上,我们需要创建一个随机集。这是我们尝试创建的记录,但所有字段均为 NULL;
CREATE PROCEDURE `create_data` ()
BEGIN
declare done bool default false;
declare anrede varchar(50);
declare vorname varchar(50);
declare nachname varchar(50);
declare _vorname cursor for select anrede, vorname from vorname order by rand();
declare _nachname cursor for select nachname from nachname order by rand();
declare continue handler for not found set done = true;
open _vorname;
open _nachname;
create_record: loop
fetch _vorname into anrede, vorname;
fetch _nachname into nachname;
insert into lp values( null,
anrede,
vorname,
nachname
);
if done then
leave create_record;
end if;
end loop;
END
我们在这里错过了什么?
请提供
SHOW CREATE TABLE lp
整个过程可以简化为一条语句:
INSERT into lp
( anrede, vorname, nachname )
SELECT null,
v.anrede,
v.vorname,
v.nachname
FROM vorname AS v
JOIN nachname AS n ON TRUE
ORDER BY RAND();
这可能是一个大表(vorname 的大小乘以 nachname 的大小)。如果您想要一张较小的桌子(就像您想要做的那样),那么
INSERT into lp
( anrede, vorname, nachname )
SELECT
( SELECT anrede FROM vorname ORDER BY RAND() LIMIT 1 ) AS anrede,
( SELECT vorname FROM vorname ORDER BY RAND() LIMIT 1 ) AS vorname,
( SELECT nachname FROM nachname ORDER BY RAND() LIMIT 1 ) AS nachname
LIMIT 1000;
第二个版本随机混合名称部分并生成恰好 1000 个名称。
使用
INSERT...SELECT...;
避免了声明变量和循环的需要。而且可能要快得多。
我认为
NULL
的目标是 AUTO_INCREMENT
;将其省略(就像我所做的那样)具有相同的效果。