J'essaye de faire une méthode pour une class qui inserta automatiquement un logging dans une table. Le problème est que je dois faire fonctionner le code pour mysql, mssql, postgresql, oracle, et sqlite.
Les seules solutions auxquelles je peux penser sont:
Créer mes propres valeurs de key primaire, mais cela semble très risqué car il peut être difficile de find une solution de security pour générer les valeurs de key primaire.
Créez un code qui permutera la méthode utilisée en fonction du pilote rdbms utilisé, mais cela semble négligé et j'aimerais utiliser une méthode conforme aux standards SQL si possible.
Comment puis-je créer cette instruction INSERT
pour travailler sur tous ces rdbms s'ils utilisent tous des methods différentes pour incrémenter automatiquement un champ de key primaire?
Utilisez du code spécialisé par-rdbms.
La conformité standard est agréable, mais il y a trop de choses qui ne fonctionnent pas sur toutes les bases de données. Commencer par des choses simples comme la citation de champs et de valeurs, des choses comme limiter le jeu de résultats au nombre donné de lignes, et éventuellement à des centaines d'autres cas.
Il n'y a rien de problématique dans l'insertion d'loggings avec un champ auto-incrémenté: typiquement, vous omettez simplement ce champ dans l'insert, la database le génère comme une valeur par défaut calculée (c'est ce qu'on appelle "auto-increment").
Le problème de portabilité se pose uniquement lorsque vous devez get la valeur de ce champ généré (qui est souvent une key primaire de substitution). Aucun moyen SQL standard pour l'get.
EDITED : oook. En ce qui concerne les commentaires, concernant mon premier paragraphe (le deuxième paragraphe est le suivant):
Il est vrai que toutes les bases de données ne supportent pas les champs d'auto-incrémentation "DEFAULT" prêts à l'emploi (mea culpa). Cependant, SI vous avez stipulé une design de schéma qui supporte ce type d'insertion (dans Postgresql, Mysql, MSSQL et -I think-SQLite, pas direct mais possible avec des triggersurs dans Oracle), ALORS vous pouvez coder vos INSERTS SQL dans un moyen simple et portable. AILLEURS, vous ne pouvez pas: dans ce cas, vous devez écrire des INSERTS spécifiques à rdbms.
Générique pur
Le seul moyen portable de le faire dans toutes les bases de données imaginables et de n'avoir qu'une seule implémentation; est de faire en sorte que l'application génère les keys en UUID et les insère en tant que champs normaux. L'avantage est que vous n'avez pas besoin de countr sur une implémentation spécifique à la langue ou à la bibliothèque pour récupérer la key, vous l'avez déjà.
Une alternative à l' UUID si vous faites de l'entreposage de données et ne mettez pas à jour les lignes après qu'elles sont INSERT
ed est un hachage cryptographique du contenu de la ligne. Demandez à votre application de concaténer tous les contenus des champs en une seule string et de tirer un hachage SHA1 de cette string. Cette key est à toutes fins pratiques garantie d'être unique pour ces contenus. Facilite la réplication et la search d'loggings en double.
Les nombres séquentiels ne sont pas tous des keys primaires.
Les keys UUID sont plus faciles à mettre en communication, et en 2011, elles sont tout aussi rapides lorsque l'indexing et l'espace ne posent aucun problème sauf si vous avez des données de taille Facebook ou Google et que vous avez l'argent pour acheter l'espace disque dont vous avez besoin. autre qu'un long
nombre aussi bien.
Un autre avantage est que vous pouvez également effectuer la réplication beaucoup plus facilement car vous n'avez pas à vous soucier de chaque database que vous essayez de synchroniser avec une key dupliquée.
SQL générique
Vous pouvez simplement laisser le champ dans l'instruction INSERT
et la database prendra soin de créer la valeur pour vous.
PHP va rendre problématique la récupération des keys générées automatiquement de manière générique. Tout ce que je peux find sur le sujet est très spécialisé, quelle que soit la database utilisée, il ne semble pas y avoir d'API générique équivalente à JDBC pour PHP.
Si vous utilisiez Java
Si vous utilisez le boolean, exécutez (Ssortingng sql, int autoGeneratedKeys) dans la class Statement . Vous pouvez lui indiquer l'index de champ dans lequel se trouve la key générée automatiquement et il la returnnera en utilisant ResultSet getGeneratedKeys () .
Oracle spécifique
Si vous définissez la valeur DEFAULT
sur le champ d'incrémentation automatique désiré dans votre DDL
pour appeler une fonction qui sélectionne la valeur suivante d'une sequence
vous pouvez également implémenter le comportement d'incrémentation automatique souhaité dans Oracle.
REMARQUE
UUID est parfois appelé GUID et sont techniquement différents mais conceptuellement la même chose.
Pourquoi n'utilisez-vous pas un ORM? PHP a une tonne d'entre eux: Docsortingne, Redbean, et bien d' autres
Le but d'un ORM est de faire abstraction de la couche de database. Cela ressemble à ce dont vous avez besoin. Votre méthode traiterait les objects dans votre code et l'ORM a le code personnalisé nécessaire pour conserver ces objects dans votre database