本文詳細(xì)記錄MySQL創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)的過程,不只是構(gòu)建步驟,更多的是每一步涉及到的知識(shí)點(diǎn)。一般創(chuàng)建數(shù)據(jù)庫(kù)有兩種方式,一種是命令,另外一種就是通過數(shù)據(jù)庫(kù)管理工具,本文主要記錄通過命令的方式創(chuàng)建;
后面的學(xué)習(xí)也都是基于這個(gè)數(shù)據(jù)庫(kù)進(jìn)行的;
場(chǎng)景
創(chuàng)建一個(gè)大學(xué)生成績(jī)管理數(shù)據(jù)庫(kù);
包含學(xué)生表、課程表、成績(jī)表、教師表四個(gè)表:
同時(shí)給每個(gè)表錄入測(cè)試數(shù)據(jù);
各表之間需要通過外鍵關(guān)聯(lián);
通過命令創(chuàng)建
學(xué)習(xí)使用命令的方式創(chuàng)建 MySQL 數(shù)據(jù)庫(kù)有以下幾點(diǎn)好處:
- 能夠更好地了解 MySQL 數(shù)據(jù)庫(kù)的工作原理和內(nèi)部結(jié)構(gòu)。使用命令行操作數(shù)據(jù)庫(kù),可以更清晰地了解數(shù)據(jù)庫(kù)的底層實(shí)現(xiàn)和交互方式,這對(duì)于深入學(xué)習(xí) MySQL 數(shù)據(jù)庫(kù)是很有幫助的。
- 在某些場(chǎng)景下能夠提高效率。在需要批量創(chuàng)建、修改或管理 MySQL 數(shù)據(jù)庫(kù)的情況下,使用命令行方式可以比桌面應(yīng)用更快速、靈活地完成任務(wù),提高工作效率。
- 可以更好地掌握 MySQL 數(shù)據(jù)庫(kù)的安全策略。使用命令行創(chuàng)建 MySQL 數(shù)據(jù)庫(kù)時(shí),需要設(shè)置數(shù)據(jù)庫(kù)的用戶名和密碼等信息,這可以幫助我們更好地掌握數(shù)據(jù)庫(kù)的訪問控制策略,保障數(shù)據(jù)安全。
- 命令行方式更加便捷和適用。在不同的操作系統(tǒng)和環(huán)境下,命令行方式都是通用的,具有一定的適用性和便捷性,這大大增加了 MySQL 數(shù)據(jù)庫(kù)的可移植性和易用性。
下面就是完整的一些過程:結(jié)構(gòu)都是命令+解釋+運(yùn)行效果
連接數(shù)據(jù)庫(kù)
mysql -u root -p
mysql
是 MySQL 數(shù)據(jù)庫(kù)的客戶端命令行工具;-u root
指定了登錄 MySQL 數(shù)據(jù)庫(kù)所使用的用戶名為root
,root
用戶是 MySQL 數(shù)據(jù)庫(kù)的超級(jí)管理員賬號(hào),具有最高權(quán)限;-p
表示需要輸入密碼才能登錄數(shù)據(jù)庫(kù)。在輸入這個(gè)命令后,系統(tǒng)會(huì)提示輸入密碼。
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.
創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE student_score_db;
在 MySQL 數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為
student_score_db
的數(shù)據(jù)庫(kù)
mysql> CREATE DATABASE student_score_db;
Query OK, 1 row affected (0.01 sec)
切換到新建的數(shù)據(jù)庫(kù)
USE student_score_db;
這個(gè)命令是用來選擇并進(jìn)入名為
student_score_db
的數(shù)據(jù)庫(kù)。執(zhí)行該命令后,MySQL 數(shù)據(jù)庫(kù)會(huì)將當(dāng)前會(huì)話的操作指向該數(shù)據(jù)庫(kù),此后所有的 SQL 命令都將在該數(shù)據(jù)庫(kù)上執(zhí)行。
mysql> USE student_score_db;
Database changed
新建學(xué)生表
CREATE TABLE stu_info (
id INT PRIMARY KEY AUTO_INCREMENT, -- 學(xué)生ID,主鍵自增長(zhǎng)
name VARCHAR(50) NOT NULL, -- 學(xué)生姓名,不允許為空
gender ENUM('男', '女') DEFAULT '男', -- 學(xué)生性別,枚舉類型,默認(rèn)為男
age INT DEFAULT 18, -- 學(xué)生年齡,默認(rèn)為18歲
major VARCHAR(50) NOT NULL, -- 學(xué)生所在專業(yè),不允許為空
class VARCHAR(50) NOT NULL, -- 學(xué)生所在班級(jí),不允許為空
admission_date DATE NOT NULL -- 學(xué)生入學(xué)日期,不允許為空
);
這個(gè)命令是用來在 MySQL 數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為
stu_info
的表,該表包含了學(xué)生的基本信息,其中:
id
是表中的主鍵,使用INT
類型表示學(xué)生ID,通過設(shè)置PRIMARY KEY AUTO_INCREMENT
可以使該字段自增長(zhǎng);name
是學(xué)生姓名,使用VARCHAR(50)
表示,設(shè)置NOT NULL
表示該字段不允許為空;gender
是學(xué)生性別,使用ENUM('男', '女')
枚舉類型表示,其中'男'
和'女'
是枚舉值,使用DEFAULT '男'
設(shè)置默認(rèn)值為'男'
;age
是學(xué)生年齡,使用INT
類型表示,使用DEFAULT 18
設(shè)置默認(rèn)值為18
;major
是學(xué)生所在專業(yè),使用VARCHAR(50)
表示,設(shè)置NOT NULL
表示該字段不允許為空;class
是學(xué)生所在班級(jí),使用VARCHAR(50)
表示,設(shè)置NOT NULL
表示該字段不允許為空;admission_date
是學(xué)生入學(xué)日期,使用DATE
類型表示,設(shè)置NOT NULL
表示該字段不允許為空。
mysql> CREATE TABLE stu_info (
-> id INT PRIMARY KEY AUTO_INCREMENT, -- 學(xué)生ID,主鍵自增長(zhǎng)
-> name VARCHAR(50) NOT NULL, -- 學(xué)生姓名,不允許為空
-> gender ENUM('男', '女') DEFAULT '男', -- 學(xué)生性別,枚舉類型,默認(rèn)為男
-> age INT DEFAULT 18, -- 學(xué)生年齡,默認(rèn)為18歲
-> major VARCHAR(50) NOT NULL, -- 學(xué)生所在專業(yè),不允許為空
-> class VARCHAR(50) NOT NULL, -- 學(xué)生所在班級(jí),不允許為空
-> admission_date DATE NOT NULL -- 學(xué)生入學(xué)日期,不允許為空
-> );
Query OK, 0 rows affected (0.02 sec)
錄入學(xué)生數(shù)據(jù)
INSERT INTO stu_info (name, gender, age, major, class, admission_date)
VALUES
('張三', '男', 19, '計(jì)算機(jī)科學(xué)與技術(shù)', '2022計(jì)算機(jī)1班', '2022-09-01'),
('李四', '男', 20, '軟件工程', '2021軟件1班', '2021-09-01'),
('王五', '女', 18, '信息管理與信息系統(tǒng)', '2023信息1班', '2023-09-01'),
('趙六', '男', 19, '計(jì)算機(jī)科學(xué)與技術(shù)', '2022計(jì)算機(jī)2班', '2022-09-01'),
('劉七', '女', 20, '數(shù)據(jù)科學(xué)與大數(shù)據(jù)技術(shù)', '2021數(shù)據(jù)1班', '2021-09-01'),
('錢八', '男', 18, '網(wǎng)絡(luò)工程', '2023網(wǎng)絡(luò)1班', '2023-09-01');
這個(gè)命令是用來向
stu_info
表中插入多條學(xué)生信息數(shù)據(jù)的語(yǔ)句。具體來說,該命令會(huì)向表中插入 6 條記錄,其中的每個(gè)記錄都由一個(gè)VALUES
子句指定,每個(gè)子句表示一條記錄的值,多條VALUES
子句之間使用逗號(hào)分隔。
mysql> INSERT INTO stu_info (name, gender, age, major, class, admission_date)
-> VALUES
-> ('張三', '男', 19, '計(jì)算機(jī)科學(xué)與技術(shù)', '2022計(jì)算機(jī)1班', '2022-09-01'),
-> ('李四', '男', 20, '軟件工程', '2021軟件1班', '2021-09-01'),
-> ('王五', '女', 18, '信息管理與信息系統(tǒng)', '2023信息1班', '2023-09-01'),
-> ('趙六', '男', 19, '計(jì)算機(jī)科學(xué)與技術(shù)', '2022計(jì)算機(jī)2班', '2022-09-01'),
-> ('劉七', '女', 20, '數(shù)據(jù)科學(xué)與大數(shù)據(jù)技術(shù)', '2021數(shù)據(jù)1班', '2021-09-01'),
-> ('錢八', '男', 18, '網(wǎng)絡(luò)工程', '2023網(wǎng)絡(luò)1班', '2023-09-01');
Query OK, 6 rows affected (0.01 sec)
Records: 6 Duplicates: 0 Warnings: 0
創(chuàng)建課程表
CREATE TABLE course (
id INT PRIMARY KEY AUTO_INCREMENT, -- 課程ID,主鍵自增長(zhǎng)
name VARCHAR(50) NOT NULL, -- 課程名稱,不允許為空
teacher_id INT NOT NULL, -- 教師ID,外鍵,參考教師表中的ID字段
credit DOUBLE NOT NULL -- 課程學(xué)分,不允許為空
);
這個(gè)命令是用來創(chuàng)建一個(gè)名為
course
的表的語(yǔ)句。具體來說,該表包含以下列:
id
:課程ID,類型為INT
,是主鍵列,并且使用AUTO_INCREMENT
屬性,表示自增長(zhǎng);name
:課程名稱,類型為VARCHAR(50)
,不允許為空;teacher_id
:教師ID,類型為INT
,不允許為空,是外鍵列,參考了教師表中的ID
列;credit
:課程學(xué)分,類型為DOUBLE
,不允許為空。其中,主鍵列指定了
PRIMARY KEY
約束,強(qiáng)制該列的值在表中唯一,并且使用AUTO_INCREMENT
關(guān)鍵字,表示該列的值會(huì)自動(dòng)遞增生成。
mysql> CREATE TABLE course (
-> id INT PRIMARY KEY AUTO_INCREMENT, -- 課程ID,主鍵自增長(zhǎng)
-> name VARCHAR(50) NOT NULL, -- 課程名稱,不允許為空
-> teacher_id INT NOT NULL, -- 教師ID,外鍵,參考教師表中的ID字段
-> credit DOUBLE NOT NULL -- 課程學(xué)分,不允許為空
-> );
Query OK, 0 rows affected (0.02 sec)
錄入課程表數(shù)據(jù)
INSERT INTO course (name, teacher_id, credit)
VALUES
('高等數(shù)學(xué)I', 1, 4.0),
('Java程序設(shè)計(jì)', 2, 3.0),
('計(jì)算機(jī)組成原理', 3, 4.0),
('數(shù)據(jù)庫(kù)原理與應(yīng)用', 4, 3.5),
('操作系統(tǒng)原理', 5, 3.5),
('數(shù)據(jù)結(jié)構(gòu)與算法', 6, 4.5);
這就是往課程表中插入數(shù)據(jù)了,具體的語(yǔ)法上面也提到過了,參考學(xué)生數(shù)據(jù)錄入模塊;
mysql> INSERT INTO course (name, teacher_id, credit)
-> VALUES
-> ('高等數(shù)學(xué)I', 1, 4.0),
-> ('Java程序設(shè)計(jì)', 2, 3.0),
-> ('計(jì)算機(jī)組成原理', 3, 4.0),
-> ('數(shù)據(jù)庫(kù)原理與應(yīng)用', 4, 3.5),
-> ('操作系統(tǒng)原理', 5, 3.5),
-> ('數(shù)據(jù)結(jié)構(gòu)與算法', 6, 4.5);
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
創(chuàng)建成績(jī)表
CREATE TABLE score (
id INT PRIMARY KEY AUTO_INCREMENT, -- 成績(jī)ID,主鍵自增長(zhǎng)
student_id INT NOT NULL, -- 學(xué)生ID,外鍵,參考學(xué)生表中的ID字段
course_id INT NOT NULL, -- 課程ID,外鍵,參考課程表中的ID字段
score DOUBLE NOT NULL -- 學(xué)生得分,不允許為空
);
在 MySQL 數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為
score
的表,該表包含以下列:
id
:成績(jī)ID,類型為INT
,是主鍵列,并且使用AUTO_INCREMENT
屬性,表示自增長(zhǎng);student_id
:學(xué)生ID,類型為INT
,不允許為空,是外鍵列,參考了學(xué)生表中的ID
列;course_id
:課程ID,類型為INT
,不允許為空,是外鍵列,參考了課程表中的ID
列;score
:學(xué)生得分,類型為DOUBLE
,不允許為空。其中,主鍵列指定了
PRIMARY KEY
約束,強(qiáng)制該列的值在表中唯一,并且使用AUTO_INCREMENT
關(guān)鍵字,表示該列的值會(huì)自動(dòng)遞增生成。
mysql> CREATE TABLE score (
-> id INT PRIMARY KEY AUTO_INCREMENT, -- 成績(jī)ID,主鍵自增長(zhǎng)
-> student_id INT NOT NULL, -- 學(xué)生ID,外鍵,參考學(xué)生表中的ID字段
-> course_id INT NOT NULL, -- 課程ID,外鍵,參考課程表中的ID字段
-> score DOUBLE NOT NULL -- 學(xué)生得分,不允許為空
-> );
Query OK, 0 rows affected (0.01 sec)
錄入成績(jī)數(shù)據(jù)
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
創(chuàng)建教師表
CREATE TABLE teacher (
id INT PRIMARY KEY AUTO_INCREMENT, -- 教師ID,主鍵自增長(zhǎng)
name VARCHAR(50) NOT NULL, -- 教師姓名,不允許為空
gender ENUM('男', '女') DEFAULT '男', -- 教師性別,枚舉類型,默認(rèn)為男
age INT DEFAULT 35, -- 教師年齡,默認(rèn)為35歲
title VARCHAR(50) NOT NULL -- 教師職稱,不允許為空
);
在 MySQL 數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為
teacher
的表,該表包含以下列:
id
:教師ID,類型為INT
,是主鍵列,并且使用AUTO_INCREMENT
屬性,表示自增長(zhǎng);name
:教師姓名,類型為VARCHAR(50)
,不允許為空;gender
:教師性別,類型為ENUM('男', '女')
,默認(rèn)值為'男'
。因?yàn)樾詣e只有兩種可能,所以使用ENUM
枚舉類型來限制其取值范圍;age
:教師年齡,類型為INT
,默認(rèn)值為35
。因?yàn)槟挲g可以有多種可能,而且默認(rèn)值為35
,所以直接使用INT
類型并設(shè)置默認(rèn)值;title
:教師職稱,類型為VARCHAR(50)
,不允許為空。
mysql> CREATE TABLE teacher (
-> id INT PRIMARY KEY AUTO_INCREMENT, -- 教師ID,主鍵自增長(zhǎng)
-> name VARCHAR(50) NOT NULL, -- 教師姓名,不允許為空
-> gender ENUM('男', '女') DEFAULT '男', -- 教師性別,枚舉類型,默認(rèn)為男
-> age INT DEFAULT 35, -- 教師年齡,默認(rèn)為35歲
-> title VARCHAR(50) NOT NULL -- 教師職稱,不允許為空
-> );
Query OK, 0 rows affected (0.02 sec)
錄入教師數(shù)據(jù)
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);
-- 在成績(jī)表中添加外鍵,參考學(xué)生表和課程表的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 語(yǔ)句在
course
表上添加一個(gè)外鍵約束,其中包含了以下幾個(gè)關(guān)鍵字(具體解釋參考Q&A部分):
ALTER TABLE
:用于修改已存在的表結(jié)構(gòu);course
:要修改的表名;ADD CONSTRAINT
:添加一個(gè)約束條件;fk_course_teacher
:新約束的名稱;FOREIGN KEY
:指定該約束為一個(gè)外鍵約束;(teacher_id)
:外鍵列名稱,即參考teacher
表中的哪一列。括號(hào)內(nèi)的內(nèi)容表示列名;REFERENCES teacher(id)
:外鍵列所參考的表和列。REFERENCES
關(guān)鍵字指定被參考表的名稱,括號(hào)內(nèi)的內(nèi)容則表示該表的某一列名稱,作為外鍵列的參考值。總結(jié)一下,這條 SQL 語(yǔ)句的作用是將
course
表中的teacher_id
列設(shè)置為外鍵列,參照teacher
表中的id
列。這樣在插入、更新或刪除數(shù)據(jù)時(shí),MySQL 數(shù)據(jù)庫(kù)會(huì)自動(dòng)檢查是否符合外鍵約束條件,從而保證了表之間的數(shù)據(jù)一致性。需要注意的是,為了使用外鍵約束,必須先創(chuàng)建被參考表
teacher
中的id
列,并將其設(shè)置為主鍵。因?yàn)橥怄I約束的作用是確保參考表中的某一列值必須存在于當(dāng)前表的某一列中,所以參考表中的該列必須設(shè)置為唯一的且非空。
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
驗(yàn)證創(chuàng)建情況
show tables;
這個(gè)命令就是展示當(dāng)前數(shù)據(jù)庫(kù)的所有表,結(jié)果如下:
具體的查詢表的數(shù)據(jù)情況,在后面的博客中介紹;
mysql> show tables;
+----------------------------+
| Tables_in_student_score_db |
+----------------------------+
| course |
| score |
| stu_info |
| teacher |
+----------------------------+
4 rows in set (0.00 sec)
你也可以通過數(shù)據(jù)庫(kù)管理工具查看,如下是用Navicat查看的數(shù)據(jù)表情況,外鍵關(guān)系也顯示的很清晰;
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
Q&A
ALTER TABLE關(guān)鍵字
ALTER TABLE
是一個(gè) SQL 語(yǔ)句,它用于修改已存在的關(guān)系型數(shù)據(jù)庫(kù)中某個(gè)表的結(jié)構(gòu),可以包括添加、修改、刪除列等操作。通過ALTER TABLE
命令,我們可以對(duì)已經(jīng)創(chuàng)建的表進(jìn)行擴(kuò)展或收縮,提高了對(duì)數(shù)據(jù)的靈活性和可維護(hù)性。例如,我們可以使用
ALTER TABLE
添加新的列,更新現(xiàn)有的列數(shù)據(jù)類型,為表添加限制約束條件等等。這個(gè)命令是關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)中必不可少的一個(gè)功能。需要注意的是,
ALTER TABLE
命令需要謹(jǐn)慎使用,因?yàn)樵撁羁赡軙?huì)導(dǎo)致表數(shù)據(jù)的丟失或者破壞表的完整性。
利用ALTER TABLE新增新的列
當(dāng)我們需要在已有的數(shù)據(jù)庫(kù)表中添加新的列時(shí),可以使用
ALTER TABLE
命令來實(shí)現(xiàn)。下面是一個(gè)使用ALTER TABLE
添加新列的示例 SQL 語(yǔ)句:ALTER TABLE 表名 ADD 列名 數(shù)據(jù)類型;
其中,
表名
表示要修改的目標(biāo)表名,列名
表示要添加的新列名,數(shù)據(jù)類型
表示該列數(shù)據(jù)類型。舉個(gè)例子,假設(shè)我們有一個(gè)名為
students
的表,現(xiàn)在想要在該表中新增一列age
,它的數(shù)據(jù)類型為整數(shù)型。則可以使用以下 SQL 語(yǔ)句來實(shí)現(xiàn):ALTER TABLE students ADD age INT;
執(zhí)行上述語(yǔ)句后,
students
表中就會(huì)新增一列age
,其數(shù)據(jù)類型為整數(shù)型。需要注意的是,當(dāng)我們向一個(gè)已存在的表中添加新的列時(shí),新的列默認(rèn)值為 NULL,如果需要給新的列賦默認(rèn)值,可以使用
DEFAULT
關(guān)鍵字。例如:ALTER TABLE students ADD address VARCHAR(50) DEFAULT 'N/A';
以上 SQL 語(yǔ)句將在
students
表中新增一列address
,其數(shù)據(jù)類型為字符串型,并默認(rèn)賦值為'N/A'
。
ADD CONSTRAINT關(guān)鍵字
ADD CONSTRAINT
是用于向關(guān)系型數(shù)據(jù)庫(kù)表中添加約束(constraint)的 SQL 語(yǔ)句,通常與ALTER TABLE
命令配合使用??梢允褂?ADD CONSTRAINT
添加多種類型的約束,例如主鍵約束、唯一性約束、外鍵約束等等。以下是添加一個(gè)主鍵約束的示例 SQL 語(yǔ)句:
ALTER TABLE table_name ADD CONSTRAINT pk_column PRIMARY KEY (column1, column2);
其中,
table_name
是目標(biāo)表名,pk_column
是將要被添加的主鍵約束的名稱,column1
和column2
是要包含在主鍵約束中的列名。需要注意的是,在執(zhí)行該命令之前,應(yīng)當(dāng)確保目標(biāo)表中已經(jīng)包含所需的列和數(shù)據(jù),并且這些列應(yīng)當(dāng)定義為不可空(即 NOT NULL)。否則,會(huì)因?yàn)闊o法滿足約束條件而導(dǎo)致添加約束失敗。
約束是啥意思
約束(Constraint)是用于定義表中數(shù)據(jù)規(guī)則和完整性的規(guī)則,以確保數(shù)據(jù)的正確性、一致性和有效性。約束可以限制表中某些列的取值范圍、必需性、唯一性等,還可以定義表之間的關(guān)系,如主鍵、外鍵等。
常見的MySQL約束包括:
- PRIMARY KEY:主鍵約束,用于唯一標(biāo)識(shí)表中每一行數(shù)據(jù)。
- UNIQUE:唯一性約束,用于限制列中的數(shù)據(jù)不能重復(fù)。
- NOT NULL:非空約束,用于限制列中的數(shù)據(jù)不能為空。
- CHECK:檢查約束,用于限制列中的數(shù)據(jù)必須滿足指定的條件。
- FOREIGN KEY:外鍵約束,用于定義兩個(gè)表之間的關(guān)系,確保子表中的數(shù)據(jù)始終與父表中的數(shù)據(jù)相符合。
需要注意的是,在MySQL中,約束可以在創(chuàng)建表時(shí)一起定義,也可以在表創(chuàng)建后通過ALTER TABLE語(yǔ)句來添加和修改。
主鍵和主鍵約束的區(qū)別
主鍵(Primary Key)和主鍵約束(Primary Key Constraint)是緊密相關(guān)的概念,但是并不完全相同。
主鍵是一種用于唯一標(biāo)識(shí)關(guān)系型數(shù)據(jù)庫(kù)表中每一個(gè)記錄的一列或若干列(確保它們的組合值在整個(gè)表中是唯一的)。主鍵所包含的列必須滿足數(shù)據(jù)每一行都具有唯一性和非空性的條件,主鍵通常用于對(duì)表進(jìn)行數(shù)據(jù)的查詢、更新和刪除操作。在表中,主鍵是通過具體的列值來定義的,而不是定義在表上的某個(gè)獨(dú)立的約束。
主鍵約束則是一種為了保證主鍵的完整性而應(yīng)用于主鍵列上的一種約束,它是一種特殊的約束,主要用于規(guī)定表中的主鍵必須滿足唯一性和非空性的條件。主鍵約束通常由關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)來執(zhí)行,可以防止用戶對(duì)主鍵列執(zhí)行一些會(huì)破壞數(shù)據(jù)完整性的操作,比如修改或者刪除主鍵列中的某些數(shù)據(jù)。
在實(shí)際應(yīng)用中,我們通常將主鍵作為一種基礎(chǔ)元素,通過主鍵約束的方式來保證主鍵所包含的列數(shù)據(jù)的完整性和唯一性,從而提高數(shù)據(jù)庫(kù)的穩(wěn)定性和安全性。
主鍵約束可以約束非主鍵列嗎
在關(guān)系型數(shù)據(jù)庫(kù)中,主鍵約束是一種為了保證表中主鍵列的唯一性和非空性而應(yīng)用于主鍵列上的一種約束。因此,主鍵約束只能應(yīng)用于表中的主鍵列,而不能應(yīng)用于其他的列。
除了主鍵約束以外,在關(guān)系型數(shù)據(jù)庫(kù)中,還有唯一性約束(UNIQUE Constraint)可以應(yīng)用于表中的不同列上,以確保這些列的值唯一。此外,檢查約束(CHECK Constraint)則可以在某些情況下對(duì)表中的非主鍵列進(jìn)行限制,以防止數(shù)據(jù)出現(xiàn)意外或錯(cuò)誤的情況。
MySQL約束在開發(fā)中的應(yīng)用
MySQL約束是一種限制數(shù)據(jù)庫(kù)表中某些列的值或它們之間關(guān)系的規(guī)則。它可以確保數(shù)據(jù)的完整性和一致性,避免無效或錯(cuò)誤的數(shù)據(jù)在存儲(chǔ)到數(shù)據(jù)庫(kù)中。以下是MySQL約束在開發(fā)中的應(yīng)用:
- 主鍵約束:可以保證表中每一行數(shù)據(jù)都有唯一的標(biāo)識(shí)符,而且這個(gè)標(biāo)識(shí)符不能為空。主鍵約束在查詢和排序時(shí)也能提高性能。
- 外鍵約束:可以確保表中指向其他表的字段只包含該表中存在的值。外鍵約束還可以防止刪除數(shù)據(jù)時(shí)出現(xiàn)意外情況(例如刪除了被其他表所引用的數(shù)據(jù))。
- 唯一約束:可以確保表中某一列的值是唯一的,也可避免特定列出現(xiàn)空值。
- 非空約束:可以確保表中的某一列不為空。
- 檢查約束:可以定義額外的規(guī)則來確保某一列或多個(gè)列的數(shù)據(jù)值符合規(guī)定。例如,可以使用檢查約束確保一個(gè)日期字段始終是當(dāng)前日期之后的日期。
- 默認(rèn)值約束:可以為某個(gè)字段指定默認(rèn)值,在插入數(shù)據(jù)時(shí)如果沒有寫入該字段,則會(huì)自動(dòng)填充默認(rèn)值。
- 組合約束:可以在多個(gè)列上同時(shí)施加規(guī)則以確保表中的信息結(jié)構(gòu)正確。
MySQL約束在fastapi中的應(yīng)用示例
在FastAPI中使用MySQL數(shù)據(jù)庫(kù)時(shí),可以通過SQLAlchemy來定義和管理約束,并將它們命名。以下是一個(gè)示例,展示了如何在FastAPI和MySQL中創(chuàng)建和命名約束:
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")
在上面的示例中,我們?yōu)閡sers表中的name列和items表中的name列添加了約束名:unique_user_name和item_name_not_null。這些約束的名稱使得其他開發(fā)人員更容易查找和理解表結(jié)構(gòu)以及進(jìn)行代碼維護(hù)和調(diào)試。
要使用以上定義的模型,并創(chuàng)建其對(duì)應(yīng)的MySQL表,需要使用SQLAlchemy和MySQL數(shù)據(jù)庫(kù)執(zhí)行以下步驟:
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)
以上示例中,我們首先創(chuàng)建一個(gè)SQLAlchemy的引擎,并定義一個(gè)SessionLocal類以進(jìn)行數(shù)據(jù)庫(kù)訪問。然后,我們使用create_all()方法來創(chuàng)建所有的表結(jié)構(gòu),并將其與連接的MySQL數(shù)據(jù)庫(kù)關(guān)聯(lián)在一起。
約束名是否要和數(shù)據(jù)庫(kù)中的約束名對(duì)應(yīng)上
如果在代碼中定義了MySQL約束名,則應(yīng)該在數(shù)據(jù)庫(kù)中將其對(duì)應(yīng)的約束名稱與之匹配。這是因?yàn)镸ySQL約束名是在創(chuàng)建表時(shí)定義的一種元數(shù)據(jù),并將存儲(chǔ)在數(shù)據(jù)庫(kù)系統(tǒng)表中。當(dāng)修改或刪除已存在的約束時(shí),MySQL需要確切地知道哪個(gè)約束必須進(jìn)行更改。
如果代碼中定義的MySQL約束名與實(shí)際數(shù)據(jù)庫(kù)中所存儲(chǔ)的不匹配,則會(huì)導(dǎo)致錯(cuò)誤。例如,如果定義了一個(gè)名為"unique_user_name"的唯一約束,但是在實(shí)際創(chuàng)建表時(shí)MySQL給它命名為"uq_users_name_5588",則在查詢和更新相關(guān)數(shù)據(jù)時(shí)就會(huì)出錯(cuò)。
因此,在開發(fā)中添加MySQL約束名時(shí),請(qǐng)務(wù)必確保每個(gè)約束名稱都與實(shí)際存儲(chǔ)在數(shù)據(jù)庫(kù)中的名稱相匹配。此外,應(yīng)避免使用太長(zhǎng)或含義不明的名稱,以便在未來快速定位約束問題。文章來源:http://www.zghlxwxcb.cn/news/detail-720848.html
原文地址:https://blog.jiumoz.com/archives/sql-bi-ji-1mysql-chuang-jian-shu-ju-ku文章來源地址http://www.zghlxwxcb.cn/news/detail-720848.html
到了這里,關(guān)于SQL筆記(1)——MySQL創(chuàng)建數(shù)據(jù)庫(kù)(收藏吃灰版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!