用MySQL Procedure同时像级联表插入数据
一个月以来都没写博客,这篇博客的目的是提醒自己继续写下去,顺便记下笔记,看官若无兴趣请直接飘过。 级联表是关系数据库存储领域模型(Domain Model)中一对多关系的不二法门,比如“学生”和“班级”,实在是常用得很。创建表时建立外键关联,查询时使用
一个月以来都没写博客,这篇博客的目的是提醒自己继续写下去,顺便记下笔记,看官若无兴趣请直接飘过。
级联表是关系数据库存储领域模型(Domain Model)中一对多关系的不二法门,比如“学生”和“班级”,实在是常用得很。创建表时建立外键关联,查询时使用inner join或者多表联合查询非常便捷。不过插入数据则相对麻烦,因为关键关联的缘故,需要先插入主表,然后再插入从表,如果使用auto_increment主键,在插入从表之前必须获取刚刚插入主表时生成的ID。
举例来说,下面classes和students表通过外键class_id建立一对多关联:
DROP TABLE IF EXISTS students; DROP TABLE IF EXISTS classes; DROP VIEW IF EXISTS student_in_class; CREATE TABLE classes( id serial, name CHAR(55) NOT NULL, UNIQUE KEY cls_name (name), PRIMARY KEY(id) ); CREATE TABLE students( NUMBER CHAR(11) NOT NULL, name VARCHAR(55) NOT NULL, class_id BIGINT UNSIGNED NOT NULL, PRIMARY KEY(NUMBER), FOREIGN KEY (class_id) REFERENCES classes(id) );
为了查询数据方便,创建一个视图,只是简单的执行级联查询:
CREATE VIEW student_in_class AS SELECT NUMBER, students.name stu_name, classes.name cls_name FROM students INNER JOIN classes ON classes.id=students.class_id;
对于之前提出的两个表同时插入数据的问题,熟悉MySQL的朋友都知道,用下面的方法就行了,先插入主表classes,然后通过last_insert_id()获取刚刚插入的id,最后向从表students插入数据。
START TRANSACTION; INSERT INTO classes(name) VALUE('Class 1'); INSERT INTO students(NUMBER, name, class_id) VALUES('001', 'Jim', last_insert_id()); commit;
不过这样还是有个问题,如果待插入的数据和主表中已有的数据有重复怎么办呢?因此笔者对以上语句进行简单的封装,使用MySQL存储过程实现整个过程,首先对主表进行查询,如果不存在待插入的数据再插入:
DROP PROCEDURE IF EXISTS insert_stu; CREATE PROCEDURE insert_stu( cls_name CHAR(55), stu_num CHAR(11), stu_name VARCHAR(55)) BEGIN DECLARE cls_id BIGINT UNSIGNED; DECLARE cls_cnt INT; SELECT COUNT(*) INTO cls_cnt FROM classes WHERE name=cls_name; IF cls_cnt = 0 THEN INSERT INTO classes(name) VALUE(cls_name); SET cls_id = last_insert_id(); ELSE SELECT id INTO cls_id FROM classes WHERE name=cls_name; END IF; INSERT INTO students(NUMBER, name, class_id) VALUES(stu_num, stu_name, cls_id); END;
调用和检验该存储过程的方法如下:
CALL insert_stu('Class 1', '001', 'Bob'); CALL insert_stu('Class 2', '002', 'Jim'); CALL insert_stu('Class 1', '003', 'Li Lei'); SELECT * FROM student_in_class;
最后一句是使用之前创建的视图查看输出结果:
number stu_name cls_name 001 Bob Class 1 002 Jim Class 2 003 Li Lei Class 1
参考:
- Stackoverflow: Is it possible to insert into two tables at the same time?
- http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html
- MySQL transaction commit
- MySQL last_insert_id() function
- MySQL If statement

原文地址:用MySQL Procedure同时像级联表插入数据, 感谢原作者分享。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



La sauvegarde et la restauration d'une base de données MySQL en PHP peuvent être réalisées en suivant ces étapes : Sauvegarder la base de données : Utilisez la commande mysqldump pour vider la base de données dans un fichier SQL. Restaurer la base de données : utilisez la commande mysql pour restaurer la base de données à partir de fichiers SQL.

Les performances des requêtes MySQL peuvent être optimisées en créant des index qui réduisent le temps de recherche d'une complexité linéaire à une complexité logarithmique. Utilisez PreparedStatements pour empêcher l’injection SQL et améliorer les performances des requêtes. Limitez les résultats des requêtes et réduisez la quantité de données traitées par le serveur. Optimisez les requêtes de jointure, notamment en utilisant des types de jointure appropriés, en créant des index et en envisageant l'utilisation de sous-requêtes. Analyser les requêtes pour identifier les goulots d'étranglement ; utiliser la mise en cache pour réduire la charge de la base de données ; optimiser le code PHP afin de minimiser les frais généraux.

Comment insérer des données dans une table MySQL ? Connectez-vous à la base de données : utilisez mysqli pour établir une connexion à la base de données. Préparez la requête SQL : Écrivez une instruction INSERT pour spécifier les colonnes et les valeurs à insérer. Exécuter la requête : utilisez la méthode query() pour exécuter la requête d'insertion en cas de succès, un message de confirmation sera généré.

Pour utiliser les procédures stockées MySQL en PHP : Utilisez PDO ou l'extension MySQLi pour vous connecter à une base de données MySQL. Préparez l'instruction pour appeler la procédure stockée. Exécutez la procédure stockée. Traitez le jeu de résultats (si la procédure stockée renvoie des résultats). Fermez la connexion à la base de données.

La création d'une table MySQL à l'aide de PHP nécessite les étapes suivantes : Connectez-vous à la base de données. Créez la base de données si elle n'existe pas. Sélectionnez une base de données. Créer un tableau. Exécutez la requête. Fermez la connexion.

" sept péchés capitaux" » Dissiper les rumeurs : selon des informations divulguées et des documents obtenus par Vox, la haute direction d'OpenAI, y compris Altman, était bien au courant de ces dispositions de récupération de capitaux propres et les a approuvées. De plus, OpenAI est confronté à un problème grave et urgent : la sécurité de l’IA. Les récents départs de cinq employés liés à la sécurité, dont deux de ses employés les plus en vue, et la dissolution de l'équipe « Super Alignment » ont une nouvelle fois mis les enjeux de sécurité d'OpenAI sur le devant de la scène. Le magazine Fortune a rapporté qu'OpenA

L'un des changements majeurs introduits dans MySQL 8.4 (la dernière version LTS en 2024) est que le plugin « MySQL Native Password » n'est plus activé par défaut. De plus, MySQL 9.0 supprime complètement ce plugin. Ce changement affecte PHP et d'autres applications

Modèle 70B, 1000 tokens peuvent être générés en quelques secondes, ce qui se traduit par près de 4000 caractères ! Les chercheurs ont affiné Llama3 et introduit un algorithme d'accélération. Par rapport à la version native, la vitesse est 13 fois plus rapide ! Non seulement il est rapide, mais ses performances sur les tâches de réécriture de code dépassent même GPT-4o. Cette réalisation vient d'anysphere, l'équipe derrière le populaire artefact de programmation d'IA Cursor, et OpenAI a également participé à l'investissement. Il faut savoir que sur Groq, un framework d'accélération d'inférence rapide bien connu, la vitesse d'inférence de 70BLlama3 n'est que de plus de 300 jetons par seconde. Avec la vitesse de Cursor, on peut dire qu'il permet une édition complète et quasi instantanée des fichiers de code. Certaines personnes l'appellent un bon gars, si tu mets Curs
