英文:
How to generate random values using SQL queries?
问题
我需要在部署应用程序之前在我的数据库中生成大量元组,以便用于测试逻辑。数据库有两个表,第一个表的架构如下:
CREATE TABLE utilisateurs (
id_utilisateur INT AUTO_INCREMENT PRIMARY KEY,
prenom VARCHAR(255),
nom VARCHAR(255),
date_de_naissance DATE,
email VARCHAR(255),
mot_de_passe VARCHAR(255),
maladie_chronique VARCHAR(255),
latitude DECIMAL(9, 6),
longitude DECIMAL(9, 6)
);
第二个表的架构如下:
CREATE TABLE utilisateurs_malade (
id_report INT AUTO_INCREMENT PRIMARY KEY,
id_utilisateur INT,
dernièrement_malade DATE,
CONSTRAINT fk_utilisateur FOREIGN KEY (id_utilisateur) REFERENCES utilisateurs(id_utilisateur)
);
我需要为第一个表生成500个或更多的元组,其中包含随机值(随机但是合逻辑的值,例如:不希望date_de_naissance
为例如500-05-02的日期)。第二个表需要生成300个或更多的元组,也包含随机值(同样是随机但是合逻辑的值,例如:id_utilisateur
必须参考第一个表,我还希望latitude
和longitude
在阿尔及利亚,换句话说:
纬度:
最小值:18.969168
最大值:37.101043
经度:
最小值:-8.673947
最大值:11.999273
如何在不手动输入超过800个查询的情况下完成这个任务?
英文:
I need to generate a lot of tuples in my database in order to use it to test my logic before deploying an application.
The database has 2 tables, here is the schema for the first table (sorry it's in french):
CREATE TABLE utilisateurs (
id_utilisateur INT AUTO_INCREMENT PRIMARY KEY,
prenom VARCHAR(255),
nom VARCHAR(255),
date_de_naissance DATE,
email VARCHAR(255),
mot_de_passe VARCHAR(255),
maladie_chronique VARCHAR(255),
latitude DECIMAL(9, 6),
longitude DECIMAL(9, 6)
);
And here is the schema of the second table :
CREATE TABLE utilisateurs_malade (
id_report INT AUTO_INCREMENT PRIMARY KEY,
id_utilisateur INT,
dernirement_malade DATE,
CONSTRAINT fk_utilisateur FOREIGN KEY (id_utilisateur) REFERENCES utilisateurs(id_utilisateur)
);
I need to generate 500 or more tuples for the first table with random values (random but logical values, I don't want the date_de_naissance which must be the date of birth in 500-05-02 for example) and 300 or more tuples for the second table with random values aswell (random but logical values aswell, for example: the id_utilisateur must refer to the first table, I also want the latitude and longitude to be in Algeria, in other words
Latitude:
Minimum: 18.969168
Maximum: 37.101043
Longitude:
Minimum: -8.673947
Maximum: 11.999273
How can do this without manually typing down more than 800 queries ?
答案1
得分: 1
以下是代码部分的翻译:
-- 为'utilisateurs'表生成随机数据
INSERT INTO utilisateurs (prenom, nom, date_de_naissance, email, mot_de_passe, maladie_chronique, latitude, longitude)
SELECT
SUBSTRING(MD5(RAND()) FROM 1 FOR 5), -- 名字
SUBSTRING(MD5(RAND()) FROM 1 FOR 5), -- 姓氏
DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 15000) DAY), -- 出生日期
CONCAT(SUBSTRING(MD5(RAND()) FROM 1 FOR 5), '.', SUBSTRING(MD5(RAND()) FROM 1 FOR 5), '@example.com'), -- 电子邮件
'password123', -- 密码
IF(RAND() < 0.5, '糖尿病', IF(RAND() < 0.5, '高血压', IF(RAND() < 0.5, '哮喘', '无'))), -- 慢性病
RAND() * (37.101043 - 18.969168) + 18.969168, -- 纬度
RAND() * (11.999273 - (-8.673947)) + (-8.673947) -- 经度
FROM
(SELECT @num:=0) AS n
WHERE
@num < 500 -- 假设您想生成500个元组
-- 为'utilisateurs_malade'表生成随机数据
INSERT INTO utilisateurs_malade (id_utilisateur, dernièrement_malade)
SELECT
FLOOR(RAND() * 500) + 1, -- id_utilisateur
DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 30) DAY) -- 最近生病日期
FROM
(SELECT @num:=0) AS n
WHERE
@num < 300 -- 假设您想生成300个元组
请注意,假设'utilisateurs'表中已经存在至少500条记录(以便'utilisateurs_malade'表中生成的随机id_utilisateur引用现有记录)。此外,RAND()函数生成0到1之间的随机浮点数,因此我们可以使用它来生成指定范围内的随机值。
英文:
Yes there is a method, I've shared an example below that generates 500 random tuples for the 'utilisateurs' table and 300 random tuples for the 'utilisateurs_malade' table.
--generate random data for utilisateurs table
INSERT INTO utilisateurs (prenom, nom, date_de_naissance, email, mot_de_passe, maladie_chronique, latitude, longitude)
SELECT
SUBSTRING(MD5(RAND()) FROM 1 FOR 5), -- prenom
SUBSTRING(MD5(RAND()) FROM 1 FOR 5), -- nom
DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 15000) DAY), -- date_de_naissance
CONCAT(SUBSTRING(MD5(RAND()) FROM 1 FOR 5), '.', SUBSTRING(MD5(RAND()) FROM 1 FOR 5), '@example.com'), -- email
'password123', -- mot_de_passe
IF(RAND() < 0.5, 'diabetes', IF(RAND() < 0.5, 'hypertension', IF(RAND() < 0.5, 'asthma', 'none'))), -- maladie_chronique
RAND() * (37.101043 - 18.969168) + 18.969168, -- latitude
RAND() * (11.999273 - (-8.673947)) + (-8.673947) -- longitude
FROM
(SELECT @num:=0) AS n
WHERE
@num < 500 -- assuming you want to generate 500 tuples
-- generate random data for utilisateurs_malade table
INSERT INTO utilisateurs_malade (id_utilisateur, dernièrement_malade)
SELECT
FLOOR(RAND() * 500) + 1, -- id_utilisateur
DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 30) DAY) -- dernièrement_malade
FROM
(SELECT @num:=0) AS n
WHERE
@num < 300 -- assuming you want to generate 300 tuples
Please also note that it is assumed that at least 500 records are already present in the utilisateurs table (so that the randomly generated id_utilisateur in the utilisateurs_malade table is referred to existing records). Also, the RAND() function generates a random floating-point number between 0 and 1, so we can use it to generate random values within a range.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论