gpt4 book ai didi

mysql - 从架构创建表复合键

转载 作者:行者123 更新时间:2023-11-29 09:31:01 25 4
gpt4 key购买 nike

GCD needs a new database created to store all the necessary information about
their students, programmes, modules, and corresponding grade per module. The
detail is as follows:

– The college keeps track of each student’s name, student number, social security
number, address, phone, date-of-birth, and gender.

– Each programme is described by a programme code, name, description, duration
(number of years), level, and the cost.

– Each module has a module code, name, description, duration (number of weeks),
level (introductory, intermediate, advance).

– Grade stores student number, module code, and a letter grade (A, B, C, D, E, F).

Each programme enrolls students. Students then register modules. At the end of the
study duration of a module students receive their grades.

由于这是一个复合键,我如何从中创建一个表?

(sNumber, mCode, grade)

我正在尝试这样

Grade
CREATE TABLE grade (
sNumber INT NOT NULL,
mCode INT NOT NULL,
grade CHAR (1),
PRIMARY KEY(sNumber, mCode)
);

组合一些命令是否是更好的做法,例如我更改某个模块的 mCode?

ON DELETE SET NULL & ON UPDATE CASCADE

最佳答案

As this is a composite key how could I create a table from this?
(SQL for CREATE TABLE)

这不会起作用,因为语法不正确。直接 RTFM 问题。

  • 当您像这样使用PRIMARY KEY时,它指的是单个列。

  • 对于多列,请在列之后、右括号之前使用 CONSTRAINT 关键字。使用有意义的约束名称(当您在管理任务期间查看列表时它将有所帮助)。

  • 这同样适用于复合 FOREIGN KEY

我将使用我对您 other question 的回答中的 StudentGrade 表。 .

CREATE TABLE student_grade (    programme_code CHAR(6) NOT NULL,    module_code    CHAR(8) NOT NULL,    student_no     BIGINT  NOT NULL,    grade          CHAR(1) NOT NULL,    CONSTRAINT pk        PRIMARY KEY ( programme_code, module_code, student_no ),    CONSTRAINT student_module_achieves_student_grade        FOREIGN KEY               ( programme_code, module_code, student_no )        REFERENCES student_module ( programme_code, module_code, student_no ),    CONSTRAINT grade_ranks_student_grade        FOREIGN KEY       ( grade )        REFERENCES grade  ( grade )    );

Would it be better practice to combine some commands like in case i change the mCode for a certain module?
ON UPDATE CASCADE

您必须了解它的作用:当您更新 PK 列时,套件会将更改级联到所有子行;孙子行;等等

  • 它节省了您编写大量执行批量 OLTP 事务的过程,以级联 DELETE 到所有后代表。

  • 这在使用真正 SQL 平台的 OLTP 系统中是被禁止的。

  • 对于 MySQL,它不是 SQL,也没有 OLTP(没有 ACID 事务;没有过程;没有服务器架构),这很好,它是小型免费软件系统的替代品。

ON DELETE SET NULL

理解。其作用是,对于具有 FK 的子行,当父行(在父表中,它是 PK)被 DELETED 时,它将子行中的 FK 设置为 NULL。

  • 同样,这是一种极其糟糕的做法,在 OLTP 系统中是被禁止的,但在 MySQL 等免费软件套件中却很常见,因为它没有 SQL、事务或批处理功能。

  • 单独的点。当您有一个关系数据库时,例如我给您的数据模型,并且它是一个“紧密”数据库:它具有关系完整性;等等,你真的不想这样做。当删除具有后代的父级时,您希望停止(错误消息)。

  • 系统安装完毕并填充数据库后,想象一下遇到 ModuleCode 的 FK 为 NULL 的 StudentGrade。

  • JOIN 将失败,这些行将不再出现在相关报告中(它们应该并且预计会出现在相关报告中)。

你也绝对不想要这个:删除级联因为您将丢失所有后代行。

关于mysql - 从架构创建表复合键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58731484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com