侧边栏壁纸
  • 累计撰写 71 篇文章
  • 累计创建 59 个标签
  • 累计收到 110 条评论

目 录CONTENT

文章目录

SQL笔记(1)——MySQL创建数据库

MinChess
2023-04-13 / 0 评论 / 0 点赞 / 535 阅读 / 6,965 字 / 正在检测是否收录...

本文详细记录MySQL创建一个数据库的过程,不只是构建步骤,更多的是每一步涉及到的知识点。一般创建数据库有两种方式,一种是命令,另外一种就是通过数据库管理工具,本文主要记录通过命令的方式创建;

后面的学习也都是基于这个数据库进行的;

场景

创建一个大学生成绩管理数据库;

包含学生表、课程表、成绩表、教师表四个表:

同时给每个表录入测试数据;

各表之间需要通过外键关联;

通过命令创建

学习使用命令的方式创建 MySQL 数据库有以下几点好处:

  1. 能够更好地了解 MySQL 数据库的工作原理和内部结构。使用命令行操作数据库,可以更清晰地了解数据库的底层实现和交互方式,这对于深入学习 MySQL 数据库是很有帮助的。
  2. 在某些场景下能够提高效率。在需要批量创建、修改或管理 MySQL 数据库的情况下,使用命令行方式可以比桌面应用更快速、灵活地完成任务,提高工作效率。
  3. 可以更好地掌握 MySQL 数据库的安全策略。使用命令行创建 MySQL 数据库时,需要设置数据库的用户名和密码等信息,这可以帮助我们更好地掌握数据库的访问控制策略,保障数据安全。
  4. 命令行方式更加便捷和适用。在不同的操作系统和环境下,命令行方式都是通用的,具有一定的适用性和便捷性,这大大增加了 MySQL 数据库的可移植性和易用性。

下面就是完整的一些过程:结构都是命令+解释+运行效果

连接数据库

mysql -u root -p
  • mysql 是 MySQL 数据库的客户端命令行工具;
  • -u root 指定了登录 MySQL 数据库所使用的用户名为 rootroot 用户是 MySQL 数据库的超级管理员账号,具有最高权限;
  • -p 表示需要输入密码才能登录数据库。在输入这个命令后,系统会提示输入密码。
C:\Users\minch>mysql -u root -p
Enter password: ****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 24
Server version: 8.0.32 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

创建数据库

CREATE DATABASE student_score_db;

在 MySQL 数据库中创建一个名为 student_score_db 的数据库

mysql> CREATE DATABASE student_score_db;
Query OK, 1 row affected (0.01 sec)

切换到新建的数据库

USE student_score_db;

这个命令是用来选择并进入名为 student_score_db 的数据库。执行该命令后,MySQL 数据库会将当前会话的操作指向该数据库,此后所有的 SQL 命令都将在该数据库上执行。

mysql> USE student_score_db;
Database changed

新建学生表

CREATE TABLE stu_info (
    id INT PRIMARY KEY AUTO_INCREMENT,  -- 学生ID,主键自增长
    name VARCHAR(50) NOT NULL,  -- 学生姓名,不允许为空
    gender ENUM('男', '女') DEFAULT '男',  -- 学生性别,枚举类型,默认为男
    age INT DEFAULT 18,  -- 学生年龄,默认为18岁
    major VARCHAR(50) NOT NULL,  -- 学生所在专业,不允许为空
    class VARCHAR(50) NOT NULL,  -- 学生所在班级,不允许为空
    admission_date DATE NOT NULL  -- 学生入学日期,不允许为空
);

这个命令是用来在 MySQL 数据库中创建一个名为 stu_info 的表,该表包含了学生的基本信息,其中:

  • id 是表中的主键,使用 INT 类型表示学生ID,通过设置 PRIMARY KEY AUTO_INCREMENT 可以使该字段自增长;
  • name 是学生姓名,使用 VARCHAR(50) 表示,设置 NOT NULL 表示该字段不允许为空;
  • gender 是学生性别,使用 ENUM('男', '女') 枚举类型表示,其中 '男''女' 是枚举值,使用 DEFAULT '男' 设置默认值为 '男'
  • age 是学生年龄,使用 INT 类型表示,使用 DEFAULT 18 设置默认值为 18
  • major 是学生所在专业,使用 VARCHAR(50) 表示,设置 NOT NULL 表示该字段不允许为空;
  • class 是学生所在班级,使用 VARCHAR(50) 表示,设置 NOT NULL 表示该字段不允许为空;
  • admission_date 是学生入学日期,使用 DATE 类型表示,设置 NOT NULL 表示该字段不允许为空。
mysql> CREATE TABLE stu_info (
    ->     id INT PRIMARY KEY AUTO_INCREMENT,  -- 学生ID,主键自增长
    ->     name VARCHAR(50) NOT NULL,  -- 学生姓名,不允许为空
    ->     gender ENUM('男', '女') DEFAULT '男',  -- 学生性别,枚举类型,默认为男
    ->     age INT DEFAULT 18,  -- 学生年龄,默认为18岁
    ->     major VARCHAR(50) NOT NULL,  -- 学生所在专业,不允许为空
    ->     class VARCHAR(50) NOT NULL,  -- 学生所在班级,不允许为空
    ->     admission_date DATE NOT NULL  -- 学生入学日期,不允许为空
    -> );
Query OK, 0 rows affected (0.02 sec)

录入学生数据

INSERT INTO stu_info (name, gender, age, major, class, admission_date)
VALUES 
    ('张三', '男', 19, '计算机科学与技术', '2022计算机1班', '2022-09-01'),
    ('李四', '男', 20, '软件工程', '2021软件1班', '2021-09-01'),
    ('王五', '女', 18, '信息管理与信息系统', '2023信息1班', '2023-09-01'),
    ('赵六', '男', 19, '计算机科学与技术', '2022计算机2班', '2022-09-01'),
    ('刘七', '女', 20, '数据科学与大数据技术', '2021数据1班', '2021-09-01'),
    ('钱八', '男', 18, '网络工程', '2023网络1班', '2023-09-01');

这个命令是用来向 stu_info 表中插入多条学生信息数据的语句。具体来说,该命令会向表中插入 6 条记录,其中的每个记录都由一个 VALUES 子句指定,每个子句表示一条记录的值,多条 VALUES 子句之间使用逗号分隔。

mysql> INSERT INTO stu_info (name, gender, age, major, class, admission_date)
    -> VALUES
    ->     ('张三', '男', 19, '计算机科学与技术', '2022计算机1班', '2022-09-01'),
    ->     ('李四', '男', 20, '软件工程', '2021软件1班', '2021-09-01'),
    ->     ('王五', '女', 18, '信息管理与信息系统', '2023信息1班', '2023-09-01'),
    ->     ('赵六', '男', 19, '计算机科学与技术', '2022计算机2班', '2022-09-01'),
    ->     ('刘七', '女', 20, '数据科学与大数据技术', '2021数据1班', '2021-09-01'),
    ->     ('钱八', '男', 18, '网络工程', '2023网络1班', '2023-09-01');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

创建课程表

CREATE TABLE course (
    id INT PRIMARY KEY AUTO_INCREMENT,  -- 课程ID,主键自增长
    name VARCHAR(50) NOT NULL,  -- 课程名称,不允许为空
    teacher_id INT NOT NULL,  -- 教师ID,外键,参考教师表中的ID字段
    credit DOUBLE NOT NULL  -- 课程学分,不允许为空
);

这个命令是用来创建一个名为 course 的表的语句。具体来说,该表包含以下列:

  • id:课程ID,类型为 INT,是主键列,并且使用 AUTO_INCREMENT 属性,表示自增长;
  • name:课程名称,类型为 VARCHAR(50),不允许为空;
  • teacher_id:教师ID,类型为 INT,不允许为空,是外键列,参考了教师表中的 ID 列;
  • credit:课程学分,类型为 DOUBLE,不允许为空。

其中,主键列指定了 PRIMARY KEY 约束,强制该列的值在表中唯一,并且使用 AUTO_INCREMENT 关键字,表示该列的值会自动递增生成。

mysql> CREATE TABLE course (
    ->     id INT PRIMARY KEY AUTO_INCREMENT,  -- 课程ID,主键自增长
    ->     name VARCHAR(50) NOT NULL,  -- 课程名称,不允许为空
    ->     teacher_id INT NOT NULL,  -- 教师ID,外键,参考教师表中的ID字段
    ->     credit DOUBLE NOT NULL  -- 课程学分,不允许为空
    -> );
Query OK, 0 rows affected (0.02 sec)

录入课程表数据

INSERT INTO course (name, teacher_id, credit)
VALUES 
    ('高等数学I', 1, 4.0),
    ('Java程序设计', 2, 3.0),
    ('计算机组成原理', 3, 4.0),
    ('数据库原理与应用', 4, 3.5),
    ('操作系统原理', 5, 3.5),
    ('数据结构与算法', 6, 4.5);

这就是往课程表中插入数据了,具体的语法上面也提到过了,参考学生数据录入模块;

mysql> INSERT INTO course (name, teacher_id, credit)
    -> VALUES
    ->     ('高等数学I', 1, 4.0),
    ->     ('Java程序设计', 2, 3.0),
    ->     ('计算机组成原理', 3, 4.0),
    ->     ('数据库原理与应用', 4, 3.5),
    ->     ('操作系统原理', 5, 3.5),
    ->     ('数据结构与算法', 6, 4.5);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

创建成绩表

CREATE TABLE score (
    id INT PRIMARY KEY AUTO_INCREMENT,  -- 成绩ID,主键自增长
    student_id INT NOT NULL,  -- 学生ID,外键,参考学生表中的ID字段
    course_id INT NOT NULL,  -- 课程ID,外键,参考课程表中的ID字段
    score DOUBLE NOT NULL  -- 学生得分,不允许为空
);

在 MySQL 数据库中创建一个名为 score 的表,该表包含以下列:

  • id:成绩ID,类型为 INT,是主键列,并且使用 AUTO_INCREMENT 属性,表示自增长;
  • student_id:学生ID,类型为 INT,不允许为空,是外键列,参考了学生表中的 ID 列;
  • course_id:课程ID,类型为 INT,不允许为空,是外键列,参考了课程表中的 ID 列;
  • score:学生得分,类型为 DOUBLE,不允许为空。

其中,主键列指定了 PRIMARY KEY 约束,强制该列的值在表中唯一,并且使用 AUTO_INCREMENT 关键字,表示该列的值会自动递增生成。

mysql> CREATE TABLE score (
    ->     id INT PRIMARY KEY AUTO_INCREMENT,  -- 成绩ID,主键自增长
    ->     student_id INT NOT NULL,  -- 学生ID,外键,参考学生表中的ID字段
    ->     course_id INT NOT NULL,  -- 课程ID,外键,参考课程表中的ID字段
    ->     score DOUBLE NOT NULL  -- 学生得分,不允许为空
    -> );
Query OK, 0 rows affected (0.01 sec)

录入成绩数据

INSERT INTO score (student_id, course_id, score)
VALUES 
    (1, 1, 85.0),
    (1, 2, 90.5),
    (2, 3, 78.0),
    (2, 4, 92.0),
    (3, 5, 88.5),
    (3, 6, 95.0);

同上!

mysql> INSERT INTO score (student_id, course_id, score)
    -> VALUES
    ->     (1, 1, 85.0),
    ->     (1, 2, 90.5),
    ->     (2, 3, 78.0),
    ->     (2, 4, 92.0),
    ->     (3, 5, 88.5),
    ->     (3, 6, 95.0);
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

创建教师表

CREATE TABLE teacher (
    id INT PRIMARY KEY AUTO_INCREMENT,  -- 教师ID,主键自增长
    name VARCHAR(50) NOT NULL,  -- 教师姓名,不允许为空
    gender ENUM('男', '女') DEFAULT '男',  -- 教师性别,枚举类型,默认为男
    age INT DEFAULT 35,  -- 教师年龄,默认为35岁
    title VARCHAR(50) NOT NULL  -- 教师职称,不允许为空
);

在 MySQL 数据库中创建一个名为 teacher 的表,该表包含以下列:

  • id:教师ID,类型为 INT,是主键列,并且使用 AUTO_INCREMENT 属性,表示自增长;
  • name:教师姓名,类型为 VARCHAR(50),不允许为空;
  • gender:教师性别,类型为 ENUM('男', '女'),默认值为 '男'。因为性别只有两种可能,所以使用 ENUM 枚举类型来限制其取值范围;
  • age:教师年龄,类型为 INT,默认值为 35。因为年龄可以有多种可能,而且默认值为 35,所以直接使用 INT 类型并设置默认值;
  • title:教师职称,类型为 VARCHAR(50),不允许为空。
mysql> CREATE TABLE teacher (
    ->     id INT PRIMARY KEY AUTO_INCREMENT,  -- 教师ID,主键自增长
    ->     name VARCHAR(50) NOT NULL,  -- 教师姓名,不允许为空
    ->     gender ENUM('男', '女') DEFAULT '男',  -- 教师性别,枚举类型,默认为男
    ->     age INT DEFAULT 35,  -- 教师年龄,默认为35岁
    ->     title VARCHAR(50) NOT NULL  -- 教师职称,不允许为空
    -> );
Query OK, 0 rows affected (0.02 sec)

录入教师数据

INSERT INTO teacher (name, gender, age, title)
VALUES 
    ('张老师', '男', 38, '教授'),
    ('李老师', '女', 39, '副教授'),
    ('王老师', '男', 35, '讲师'),
    ('赵老师', '女', 36, '教授'),
    ('刘老师', '男', 40, '副教授'),
    ('钱老师', '女', 37, '讲师');

同上!

mysql> INSERT INTO teacher (name, gender, age, title)
    -> VALUES
    ->     ('张老师', '男', 38, '教授'),
    ->     ('李老师', '女', 39, '副教授'),
    ->     ('王老师', '男', 35, '讲师'),
    ->     ('赵老师', '女', 36, '教授'),
    ->     ('刘老师', '男', 40, '副教授'),
    ->     ('钱老师', '女', 37, '讲师');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

添加外键

-- 在课程表中添加外键,参考教师表的ID字段
ALTER TABLE course ADD CONSTRAINT fk_course_teacher FOREIGN KEY (teacher_id) REFERENCES teacher(id);

-- 在成绩表中添加外键,参考学生表和课程表的ID字段
ALTER TABLE score ADD CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES stu_info(id);
ALTER TABLE score ADD CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES course(id);

以第一条命令为例;

这条 SQL 语句在 course 表上添加一个外键约束,其中包含了以下几个关键字(具体解释参考Q&A部分):

  • ALTER TABLE:用于修改已存在的表结构;
  • course:要修改的表名;
  • ADD CONSTRAINT:添加一个约束条件;
  • fk_course_teacher:新约束的名称;
  • FOREIGN KEY:指定该约束为一个外键约束;
  • (teacher_id):外键列名称,即参考 teacher 表中的哪一列。括号内的内容表示列名;
  • REFERENCES teacher(id):外键列所参考的表和列。REFERENCES 关键字指定被参考表的名称,括号内的内容则表示该表的某一列名称,作为外键列的参考值。

总结一下,这条 SQL 语句的作用是将 course 表中的 teacher_id 列设置为外键列,参照 teacher 表中的 id 列。这样在插入、更新或删除数据时,MySQL 数据库会自动检查是否符合外键约束条件,从而保证了表之间的数据一致性。

需要注意的是,为了使用外键约束,必须先创建被参考表 teacher 中的 id 列,并将其设置为主键。因为外键约束的作用是确保参考表中的某一列值必须存在于当前表的某一列中,所以参考表中的该列必须设置为唯一的且非空。

mysql> ALTER TABLE course ADD CONSTRAINT fk_course_teacher FOREIGN KEY (teacher_id) REFERENCES teacher(id);
Query OK, 6 rows affected (0.05 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE score ADD CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES stu_info(id);
Query OK, 6 rows affected (0.05 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE score ADD CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES course(id);
Query OK, 6 rows affected (0.05 sec)
Records: 6  Duplicates: 0  Warnings: 0

验证创建情况

show tables;

这个命令就是展示当前数据库的所有表,结果如下:

具体的查询表的数据情况,在后面的博客中介绍;

mysql> show tables;
+----------------------------+
| Tables_in_student_score_db |
+----------------------------+
| course                     |
| score                      |
| stu_info                   |
| teacher                    |
+----------------------------+
4 rows in set (0.00 sec)

你也可以通过数据库管理工具查看,如下是用Navicat查看的数据表情况,外键关系也显示的很清晰;

Navicat安装:https://blog.jiumoz.com/archives/navicatpremium16-de-po-jie-yu-an-zhuang

Navicat连接:https://blog.jiumoz.com/archives/mysql-an-zhuang-pei-zhi-yu-navicat-lian-jie

image-20230413183356895

Q&A

ALTER TABLE关键字

ALTER TABLE 是一个 SQL 语句,它用于修改已存在的关系型数据库中某个表的结构,可以包括添加、修改、删除列等操作。通过 ALTER TABLE 命令,我们可以对已经创建的表进行扩展或收缩,提高了对数据的灵活性和可维护性。

例如,我们可以使用 ALTER TABLE 添加新的列,更新现有的列数据类型,为表添加限制约束条件等等。这个命令是关系型数据库管理系统(RDBMS)中必不可少的一个功能。

需要注意的是,ALTER TABLE 命令需要谨慎使用,因为该命令可能会导致表数据的丢失或者破坏表的完整性。

利用ALTER TABLE新增新的列

当我们需要在已有的数据库表中添加新的列时,可以使用 ALTER TABLE 命令来实现。下面是一个使用 ALTER TABLE 添加新列的示例 SQL 语句:

ALTER TABLE 表名 ADD 列名 数据类型;

其中,表名 表示要修改的目标表名,列名 表示要添加的新列名,数据类型 表示该列数据类型。

举个例子,假设我们有一个名为 students 的表,现在想要在该表中新增一列 age,它的数据类型为整数型。则可以使用以下 SQL 语句来实现:

ALTER TABLE students ADD age INT;

执行上述语句后,students 表中就会新增一列 age,其数据类型为整数型。

需要注意的是,当我们向一个已存在的表中添加新的列时,新的列默认值为 NULL,如果需要给新的列赋默认值,可以使用 DEFAULT 关键字。例如:

ALTER TABLE students ADD address VARCHAR(50) DEFAULT 'N/A';

以上 SQL 语句将在 students 表中新增一列 address,其数据类型为字符串型,并默认赋值为 'N/A'

ADD CONSTRAINT关键字

ADD CONSTRAINT 是用于向关系型数据库表中添加约束(constraint)的 SQL 语句,通常与 ALTER TABLE 命令配合使用。可以使用 ADD CONSTRAINT 添加多种类型的约束,例如主键约束、唯一性约束、外键约束等等。

以下是添加一个主键约束的示例 SQL 语句:

ALTER TABLE table_name ADD CONSTRAINT pk_column PRIMARY KEY (column1, column2);

其中,table_name 是目标表名,pk_column 是将要被添加的主键约束的名称,column1column2 是要包含在主键约束中的列名。

需要注意的是,在执行该命令之前,应当确保目标表中已经包含所需的列和数据,并且这些列应当定义为不可空(即 NOT NULL)。否则,会因为无法满足约束条件而导致添加约束失败。

约束是啥意思

约束(Constraint)是用于定义表中数据规则和完整性的规则,以确保数据的正确性、一致性和有效性。约束可以限制表中某些列的取值范围、必需性、唯一性等,还可以定义表之间的关系,如主键、外键等。

常见的MySQL约束包括:

  • PRIMARY KEY:主键约束,用于唯一标识表中每一行数据。
  • UNIQUE:唯一性约束,用于限制列中的数据不能重复。
  • NOT NULL:非空约束,用于限制列中的数据不能为空。
  • CHECK:检查约束,用于限制列中的数据必须满足指定的条件。
  • FOREIGN KEY:外键约束,用于定义两个表之间的关系,确保子表中的数据始终与父表中的数据相符合。

需要注意的是,在MySQL中,约束可以在创建表时一起定义,也可以在表创建后通过ALTER TABLE语句来添加和修改。

主键和主键约束的区别

主键(Primary Key)和主键约束(Primary Key Constraint)是紧密相关的概念,但是并不完全相同。

主键是一种用于唯一标识关系型数据库表中每一个记录的一列或若干列(确保它们的组合值在整个表中是唯一的)。主键所包含的列必须满足数据每一行都具有唯一性和非空性的条件,主键通常用于对表进行数据的查询、更新和删除操作。在表中,主键是通过具体的列值来定义的,而不是定义在表上的某个独立的约束。

主键约束则是一种为了保证主键的完整性而应用于主键列上的一种约束,它是一种特殊的约束,主要用于规定表中的主键必须满足唯一性和非空性的条件。主键约束通常由关系型数据库管理系统(RDBMS)来执行,可以防止用户对主键列执行一些会破坏数据完整性的操作,比如修改或者删除主键列中的某些数据。

在实际应用中,我们通常将主键作为一种基础元素,通过主键约束的方式来保证主键所包含的列数据的完整性和唯一性,从而提高数据库的稳定性和安全性。

主键约束可以约束非主键列吗

在关系型数据库中,主键约束是一种为了保证表中主键列的唯一性和非空性而应用于主键列上的一种约束。因此,主键约束只能应用于表中的主键列,而不能应用于其他的列。

除了主键约束以外,在关系型数据库中,还有唯一性约束(UNIQUE Constraint)可以应用于表中的不同列上,以确保这些列的值唯一。此外,检查约束(CHECK Constraint)则可以在某些情况下对表中的非主键列进行限制,以防止数据出现意外或错误的情况。

MySQL约束在开发中的应用

MySQL约束是一种限制数据库表中某些列的值或它们之间关系的规则。它可以确保数据的完整性和一致性,避免无效或错误的数据在存储到数据库中。以下是MySQL约束在开发中的应用:

  1. 主键约束:可以保证表中每一行数据都有唯一的标识符,而且这个标识符不能为空。主键约束在查询和排序时也能提高性能。
  2. 外键约束:可以确保表中指向其他表的字段只包含该表中存在的值。外键约束还可以防止删除数据时出现意外情况(例如删除了被其他表所引用的数据)。
  3. 唯一约束:可以确保表中某一列的值是唯一的,也可避免特定列出现空值。
  4. 非空约束:可以确保表中的某一列不为空。
  5. 检查约束:可以定义额外的规则来确保某一列或多个列的数据值符合规定。例如,可以使用检查约束确保一个日期字段始终是当前日期之后的日期。
  6. 默认值约束:可以为某个字段指定默认值,在插入数据时如果没有写入该字段,则会自动填充默认值。
  7. 组合约束:可以在多个列上同时施加规则以确保表中的信息结构正确。

MySQL约束在fastapi中的应用示例

在FastAPI中使用MySQL数据库时,可以通过SQLAlchemy来定义和管理约束,并将它们命名。以下是一个示例,展示了如何在FastAPI和MySQL中创建和命名约束:

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False, unique=True, name="unique_user_name")
    age = Column(Integer, nullable=False)

class Item(Base):
    __tablename__ = 'items'
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False, name="item_name_not_null")
    price = Column(Integer, nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))
    user = relationship("User", backref="items")

在上面的示例中,我们为users表中的name列和items表中的name列添加了约束名:unique_user_name和item_name_not_null。这些约束的名称使得其他开发人员更容易查找和理解表结构以及进行代码维护和调试。

要使用以上定义的模型,并创建其对应的MySQL表,需要使用SQLAlchemy和MySQL数据库执行以下步骤:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "mysql://user:password@localhost/db_name"

engine = create_engine(
    SQLALCHEMY_DATABASE_URL
)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base.metadata.create_all(bind=engine)

以上示例中,我们首先创建一个SQLAlchemy的引擎,并定义一个SessionLocal类以进行数据库访问。然后,我们使用create_all()方法来创建所有的表结构,并将其与连接的MySQL数据库关联在一起。

约束名是否要和数据库中的约束名对应上

如果在代码中定义了MySQL约束名,则应该在数据库中将其对应的约束名称与之匹配。这是因为MySQL约束名是在创建表时定义的一种元数据,并将存储在数据库系统表中。当修改或删除已存在的约束时,MySQL需要确切地知道哪个约束必须进行更改。

如果代码中定义的MySQL约束名与实际数据库中所存储的不匹配,则会导致错误。例如,如果定义了一个名为"unique_user_name"的唯一约束,但是在实际创建表时MySQL给它命名为"uq_users_name_5588",则在查询和更新相关数据时就会出错。

因此,在开发中添加MySQL约束名时,请务必确保每个约束名称都与实际存储在数据库中的名称相匹配。此外,应避免使用太长或含义不明的名称,以便在未来快速定位约束问题。


欢 迎 关 注 博 主 个 人 小 程 序!
0

评论区