仅使用MySQL代码将多维数据插入表中

仅使用MySQL代码将多维数据插入表中,mysql,Mysql,我正在探索使用mysql过程插入嵌入其他json对象的json对象语句的可能性。假设我创建了这两个mysql表: CREATE TABLE `student` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `birth_date` date NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEF

我正在探索使用mysql过程插入嵌入其他json对象的json对象语句的可能性。假设我创建了这两个mysql表:

CREATE TABLE `student` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `birth_date` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


CREATE TABLE `course` (
  `course_id` int(11) unsigned NOT NULL,
  `student_id` int(11) unsigned NOT NULL,
  `enrollment_date` date NOT NULL,
  CONSTRAINT `courses_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
假设我接收到以下JSON对象,我打算将其转换并插入到student和course表中:

let payload = [
    {
        name:"Alice",
        birth_date:"1968-01-28",
        courses:[
            {course_id:4325,enrollment_date:"2018-05-01"},
            {course_id:3119,enrollment_date:"2018-09-01"},
            {course_id:1302,enrollment_date:"2018-01-01"},
        ],
    },
    {
        name:"Bob",
        birth_date:"1971-10-01",
        courses:[
            {course_id:2000,enrollment_date:"2018-09-01"},
            {course_id:3109,enrollment_date:"2018-09-01"},
            {course_id:4305,enrollment_date:"2018-09-01"},
        ],
    },
];
在过去,我会使用客户端代码插入json数据,这样做

foreach (payload as student) {
    studentId = exec_prepared_statement("INSERT INTO student SET name= ?, birth_date = ?",student.name,student.birth_date)
    foreach(student.courses as course){
        courseId = exec_prepared_statement("INSERT INTO course SET student_id = ?, course_id = ?, enrollment_date = ?",studentId, course.course_id,course.enrollment_date)
    }
}
但我不确定如何使用纯MySQL代码实现这一系列插入行为,因为我不确定如何将多维数据传递到MySQL存储过程中。如果我能在某处看到这样的例子,那就太好了


或者,有人可以告诉我,我是否应该完全避免尝试通过纯MySQL代码插入多维数据……我应该让PHP、Go、JS等客户端代码来完成这项工作?我真的很想看看MySQL会是什么样子,这样我就可以比较哪一个更易于维护。

在SQL中很难做到这一点,它没有任何结构化数据类型,比如数组和对象,可以循环使用。通常,您使用表来实现数组,但是如果任务首先要填充表,那么这并没有多大帮助。MySQL 5.7添加了一个JSON数据类型,您可以使用它。我现在还不知道什么。我刚刚通过谷歌搜索找到了微软关于SQL Server 2016支持的文档,我相信你可以对你关心的所有其他数据库也这样做。这可能是它们中的一个新特性,我不知道它们有多兼容。我建议不要使用JSON数据类型,直到它们在搜索和更新方面更可用。一个正常化的表格几乎总是一个更好的解决方案。话虽如此,在MySQL中循环数组的唯一方法是使用存储过程,因此您也可以在应用程序框架中这样做。