Une rapide requête SQL pour générer des données d'exemple
-
01-10-2019 - |
Question
Je dois remplir un vide table avec une centaine de faux enregistrements à logins simulent au cours des deux dernières années pour tester mon code.
Le schéma de table de connexion ressemble à:
CREATE TABLE `Logins` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`User_ID` int(11) NOT NULL,
`Date_Login` datetime NOT NULL,
`Location` enum('site','admin') NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Je suis vraiment nouveau à SQL en général, donc, je n'ai pas la moindre idée de ce que la requête devrait ressembler passé
INSERT INTO `Logins` (`User_ID`,`Date_Login`,`Location`) VALUES ...
Il me faut insérer les entrées N (permet de dire 100) en sorte que Logins
-
User_ID
puise ses valeurs dans le champ deUsers
de tableID
-
Date_Login
devrait être entre il y a 2 ans et maintenant -
Location
doit alterner entre'site'
et'admin'
, mais avec'site'
plus fortement pondéré (disons 80% du temps).
Si tout va bien, je peux glaner quelques SQL-fu à l'aide à des problèmes similaires à l'avenir: D
Merci!
(j'utilise MySQL 5.1)
La solution
Voici une instruction SQL pour insérer une seule ligne dans la table Logins. Vous pouvez exécuter ce à plusieurs reprises (par exemple dans une procédure stockée) pour obtenir plusieurs enregistrements. Vous devez exécuter plusieurs fois pour obtenir plusieurs enregistrements parce que si vous augmentez LIMIT 1
vous obtiendrez LIMIT 10
10 enregistrements, mais les valeurs de User_ID
seront les mêmes pour chaque enregistrement.
INSERT INTO `Logins` (`User_ID`, `Date_Login`, `Location`)
SELECT
users.ID AS `User_ID`,
DATE_SUB(NOW(), INTERVAL FLOOR(1 + (RAND() * (365 * 2))) DAY) AS `Date_Login`,
IF(RAND() > 0.8, 'admin', 'site') AS `Location`
FROM users
ORDER BY RAND()
LIMIT 1;
Normalement ORDER BY RAND()
est mauvais style parce qu'il est inefficace, mais ce n'est pas une tâche sensible à la performance.
Autres conseils
Si vous souhaitez utiliser une solution SQL complète, voici comment vous pouvez créer une boucle: http://dev.mysql.com/doc/refman/5.1/en/iterate-statement.html Pour obtenir une date aléatoire, vous pouvez utiliser RAND () en combinaison avec +, * et quelques horodatages.