Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中,通过循环特定表中的行来创建多个表_Mysql_Sql_Loops_Rows_Create Table - Fatal编程技术网

在MySQL中,通过循环特定表中的行来创建多个表

在MySQL中,通过循环特定表中的行来创建多个表,mysql,sql,loops,rows,create-table,Mysql,Sql,Loops,Rows,Create Table,我如何在MySQL中使用循环遍历Subject表,并使用Math、Econs、Chem作为示例为每个主题创建一个表,如下所示。引入php只是作为最后的手段 表:受试者 |受试者|单位|工作人员| |数学| 3 |詹姆斯先生| |经济顾问史密斯博士| |Chem | 2 | Aisha夫人| 表:数学 学生|测试1 |测试2 |考试| 101 | 10 | 20 | 30| 105 | 11 | 09 | 45| 表:经济 学生|测试1 |测试2 |考试| 101 | 10 | 20 | 30|

我如何在MySQL中使用循环遍历Subject表,并使用Math、Econs、Chem作为示例为每个主题创建一个表,如下所示。引入php只是作为最后的手段

表:受试者

|受试者|单位|工作人员| |数学| 3 |詹姆斯先生| |经济顾问史密斯博士| |Chem | 2 | Aisha夫人|

表:数学

学生|测试1 |测试2 |考试| 101 | 10 | 20 | 30| 105 | 11 | 09 | 45|

表:经济

学生|测试1 |测试2 |考试| 101 | 10 | 20 | 30| 105 | 11 | 09 | 45|

表:化学

学生|测试1 |测试2 |考试| 101 | 10 | 20 | 30|
105 | 11 | 09 | 45 |

设计数据库时,首先需要确定支持目标所需的所有实体。在您的情况下,您需要跟踪学生以及他们在各种课程/科目中的成绩

基于此,我们可以确定以下实体:

数学、化学等科目。 为这些科目参加考试的学生。 负责教授科目和准备考试/测验的工作人员。 不同类型的测试,即课堂测试、考试等。 学生在某一特定科目的特定类型的考试中的成绩。 因此,基于这个相当简化的场景,我们只需要5个表。第二件事是确定实体之间的关系。让我们回顾一下

一个主题只能由一名工作人员演示,但一名工作人员可以演示多个主题。例如,数学只由琼斯先生教,但琼斯先生教数学和科学。这就是我们所说的一对多关系。 一个学生可以在许多学科中获得许多结果,而一个学科可以有许多学生获得许多结果。例如,学生1参加了一次数学考试和一次数学考试,结果不同。数学科目可能有100名学生,每个学生记录一个或多个结果。这是一种多对多的关系。 学生的每一个成绩都将是某种类型的考试或测验。因此,这里存在一对多关系。只有一种考试类型,但数学、科学、地理和历史都使用这种考试类型。 因此,基于所有这些,我们创建了一个小型的演示数据库。我会带你度过难关

以下是结构的视觉表示:

这是数据库的代码

CREATE SCHEMA IF NOT EXISTS `coursedb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `coursedb` ;

-- -----------------------------------------------------
-- Table `coursedb`.`staff`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `coursedb`.`staff` (
 `staff_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
 `staff_name` VARCHAR(64) NOT NULL,
 `staff_surname` VARCHAR(64) NOT NULL,
 `staff_title` VARCHAR(64) NOT NULL,
  PRIMARY KEY (`staff_ID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `coursedb`.`subject`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `coursedb`.`subject` (
`subject_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`subject_name` VARCHAR(64) NULL,
`staff_ID` INT UNSIGNED NOT NULL,
PRIMARY KEY (`subject_ID`),
INDEX `fk_subject_staff_idx` (`staff_ID` ASC),
CONSTRAINT `fk_subject_staff`
  FOREIGN KEY (`staff_ID`)
  REFERENCES `coursedb`.`staff` (`staff_ID`)
  ON DELETE NO ACTION
  ON UPDATE NO ACTION
)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `coursedb`.`student`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `coursedb`.`student` (
  `student_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `student_name` VARCHAR(64) NOT NULL,
  PRIMARY KEY (`student_ID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `coursedb`.`subject_result_type`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `coursedb`.`subject_result_type` (
  `subject_result_type_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `subject_result_type_name` VARCHAR(64) NOT NULL,
  PRIMARY KEY (`subject_result_type_ID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `coursedb`.`subject_student_result`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `coursedb`.`subject_student_result` (
  `subject_ID` INT UNSIGNED NOT NULL,
  `student_ID` INT UNSIGNED NOT NULL,
  `subject_student_result_date` DATE NOT NULL,
  `subject_student_result_score` INT NOT NULL,
  `subject_result_type_ID` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`subject_ID`, `student_ID`, `subject_student_result_date`),
  INDEX `fk_subject_student_result_subject1_idx` (`subject_ID` ASC),
  INDEX `fk_subject_student_result_student1_idx` (`student_ID` ASC),
  INDEX `fk_subject_student_result_subject_result_type1_idx`  (`subject_result_type_ID` ASC),
  CONSTRAINT `fk_subject_student_result_subject1`
    FOREIGN KEY (`subject_ID`)
    REFERENCES `coursedb`.`subject` (`subject_ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_subject_student_result_student1`
    FOREIGN KEY (`student_ID`)
    REFERENCES `coursedb`.`student` (`student_ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_subject_student_result_subject_result_type1`
    FOREIGN KEY (`subject_result_type_ID`)
    REFERENCES `coursedb`.`subject_result_type` (`subject_result_type_ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
     CREATE TABLE IF NOT EXISTS `coursedb`.`subject` (
       `subject_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
       `subject_name` VARCHAR(64) NULL,
       `staff_ID` INT UNSIGNED NOT NULL,
       PRIMARY KEY (`subject_ID`),
       INDEX `fk_subject_staff_idx` (`staff_ID` ASC),
       CONSTRAINT `fk_subject_staff`
         FOREIGN KEY (`staff_ID`)
         REFERENCES `coursedb`.`staff` (`staff_ID`)
         ON DELETE NO ACTION
         ON UPDATE NO ACTION)
     ENGINE = InnoDB;
让我们开始添加一些数据,这样您就可以看到这一切是如何结合在一起的。首先,让我们添加两名员工琼斯先生和脾气暴躁小姐

执行以下代码:

INSERT INTO `coursedb`.`staff`
(
  `staff_name`,
  `staff_surname`,
  `staff_title` 
)
SELECT 'James', 'Jones','Mr'
UNION 
SELECT 'Pot','Grumpy','Miss';
INSERT INTO `coursedb`.`subject`
(
    `subject_name`,
    `staff_ID`
)
VALUES
(
    'Math',
     1
);


INSERT INTO `coursedb`.`subject`
(
    `subject_name`,
    `staff_ID`
)
VALUES
(
     'Science',
      1
);


INSERT INTO `coursedb`.`subject`
(
    `subject_name`,
    `staff_ID`
)
VALUES
(
  'Art',
   2
);
这将插入两名工作人员。如果通过执行SELECT语句查看新插入的数据,您将发现以下数据:

 staff_ID staff_name  staff_surname  staff_title
 '1',     'James',    'Jones',       'Mr'
 '2',     'Pot',      'Grumpy',      'Miss'
注意数据库是如何为这些工作人员分配ID号的吗?这是staff成员的主键,我们使用它来标识staff表中的行。我暂时保留这个自动编号,但这里有几个选项

我们现在需要创建这两名员工所教授的课程。琼斯先生教数学和科学,格鲁普小姐教艺术。让我们创建主题并将其链接到工作人员。这可以通过以下代码完成:

INSERT INTO `coursedb`.`staff`
(
  `staff_name`,
  `staff_surname`,
  `staff_title` 
)
SELECT 'James', 'Jones','Mr'
UNION 
SELECT 'Pot','Grumpy','Miss';
INSERT INTO `coursedb`.`subject`
(
    `subject_name`,
    `staff_ID`
)
VALUES
(
    'Math',
     1
);


INSERT INTO `coursedb`.`subject`
(
    `subject_name`,
    `staff_ID`
)
VALUES
(
     'Science',
      1
);


INSERT INTO `coursedb`.`subject`
(
    `subject_name`,
    `staff_ID`
)
VALUES
(
  'Art',
   2
);
通过执行以下查询,您现在可以看到琼斯先生教授哪些科目:

SELECT *
FROM   staff stf
INNER JOIN `subject` sub
      ON stf.staff_ID = sub.staff_ID
WHERE stf.staff_ID =1;
 SELECT *
 FROM subject_student_result ssr
 INNER JOIN student std
       ON ssr.student_ID = std.student_ID
 INNER JOIN `subject` sub
       ON ssr.subject_ID = sub.subject_ID
 INNER JOIN subject_result_type srt
       ON ssr.subject_result_type_ID = srt.subject_result_type_ID
 INNER JOIN staff stf
       ON sub.staff_ID = stf.staff_ID
因此,在我们追踪学生在课程中的表现之前,有两条信息缺失。结果的类型,即考试或测试,当然还有一些学生。因此,让我们添加它们

INSERT INTO `coursedb`.`student`
(
   `student_name`
)
VALUES
(
    'Student 1'
);


INSERT INTO `coursedb`.`subject_result_type`
(
  `subject_result_type_name`
)
SELECT 'Test'
UNION 
SELECT 'Exam'
有了这些,让我们为学生1记录一些结果。一个学生写了两门考试,一门科学,一门数学,一个学生还做了一门艺术考试。以下SQL将插入此数据:

 INSERT INTO `coursedb`.`subject_student_result`
 (`subject_ID`,
  `student_ID`,
  `subject_student_result_date`,
  `subject_student_result_score`,
  `subject_result_type_ID`
  )
  VALUES
  (
    1,
    1,
    CURDATE(),
    80,
    2
 );

 INSERT INTO `coursedb`.`subject_student_result`
 ( `subject_ID`,
   `student_ID`,
   `subject_student_result_date`,
   `subject_student_result_score`,
   `subject_result_type_ID`
 )
 VALUES
 (
    2,
    1,
    CURDATE(),
    60,
    2
 );
INSERT INTO `coursedb`.`subject_student_result`
(  `subject_ID`,
   `student_ID`,
   `subject_student_result_date`,
   `subject_student_result_score`,
   `subject_result_type_ID`
 )
 VALUES
 (
    3,
    1,
    CURDATE(),
    80,
    1
  );
现在,您可以通过执行以下查询来绘制学生及其结果的报告:

SELECT *
FROM   staff stf
INNER JOIN `subject` sub
      ON stf.staff_ID = sub.staff_ID
WHERE stf.staff_ID =1;
 SELECT *
 FROM subject_student_result ssr
 INNER JOIN student std
       ON ssr.student_ID = std.student_ID
 INNER JOIN `subject` sub
       ON ssr.subject_ID = sub.subject_ID
 INNER JOIN subject_result_type srt
       ON ssr.subject_result_type_ID = srt.subject_result_type_ID
 INNER JOIN staff stf
       ON sub.staff_ID = stf.staff_ID

我建议你仔细研究这个模型,真正理解我向你展示的内容。它将使您的设计更简单、更清洁,并且大大减少维护。

请查看。并在每次迭代中创建at表。请分享您的尝试。我确信为每个主题创建表时需要一个循环过程,但我不知道如何在MySQL中编写过程。这不是一个好的数据库设计。说真的,你会制造一场维护噩梦。你们需要阅读这个答案,我敦促你们不要动态创建表。@Namphibian,谢谢你们所有的人的贡献。表的创建将是一次性的。我需要500门课程中每一门课程的评分表。我正在努力。我意识到我需要学习MySQL Curso程序才能做到这一点。我希望我有一个专业人士在这个方向上投更多的光。谢谢你的大力支持。作为一个新手,我不会 花时间学习和消化你的贡献。