表(Table)
创建、修改以及删除表结构
基础知识
创建表
基本语法:
CREATE [ TEMPORARY ] TABLE [ IF NOT EXISTS ] <表名>
[( <字段名> <数据类型> [ 完整性约束条件 ] [,…] )]
[ 表的选项 ];示例:
-- 创建表,如果它还没存在
CREATE TABLE IF NOT EXISTS Employees(
E_ID VARCHAR(8) PRIMARY KEY COMMENT '员工编号',
E_NAME VARCHAR(8) NOT NULL COMMENT '员工姓名',
SEX VARCHAR(2) DEFAULT '男' COMMENT '性别',
PROFESSIONAL VARCHAR(6) COMMENT '职称',
D_ID VARCHAR(5) NOT NULL COMMENT '与Departments表关联',
CONSTRAINT fk_did FOREIGN KEY(D_ID) REFERENCES Departments(D_ID)
);修改表
基本语法:
ALTER TABLE <表名>
{ [ ADD <新字段名> <数据类型> [ <完整性约束条件> ] [,…] ]
| [ ADD INDEX [ 索引名 ] (索引字段,...) ]
| [ MODIFY COLUMN <字段名> <新数据类型> [ <完整性约束条件> ] ]
| [ DROP { COLUMN <字段名> | <完整性约束名> } [,…] ]
| DROP INDEX <索引名>
| RENAME [ AS ] <新表名>
};示例:
-- 添加字段:向 student 表添加“专业”字段
ALTER TABLE student ADD 专业 CHAR(30);
-- 修改字段的数据类型:修改 course 表中学分的数据类型
ALTER TABLE course MODIFY 学分 SMALLINT;
-- 删除字段:删除 student 表中的“专业”字段
ALTER TABLE student DROP COLUMN 专业;
-- 重命名表:重命名 student 表为 stu
ALTER TABLE student RENAME AS stu;删除表
基本语法:
DROP [ TEMPORARY ] TABLE [ IF EXISTS ] <表名> [ ,<表名>... ];示例:
-- 删除sc表,如果它存在
DROP TABLE IF EXISTS sc;PRIMARY KEY 约束
PRIMARY KEY 指代主键,主键的值必须唯一且不可为NULL 。
创建方法
创建 PRIMARY KEY 约束有两种方法:
直接在每条字段定义之后声明。这种方式不能指定约束的名称,不能创建联合主键约束(即多个字段共同构成主键)。
使用单独的子句声明。这种方式可以指定约束的姓名,允许创建联合主键。
基本语法:
-- 方法二
[ CONSTRAINT <约束名> ] PRIMARY KEY ( 字段名[,…] )示例:
-- 方法一:直接追加在字段定义之后
CREATE TABLE student (
学号 CHAR(9) PRIMARY KEY,
姓名 VARCHAR(10)
);
-- 方法二:单独创建
CREATE TABLE student (
学号 CHAR(9),
姓名 VARCHAR(10),
CONSTRAINT p_xh PRIMARY KEY (学号)
);
-- 方法二:创建联合主键
CREATE TABLE sc (
学号 CHAR(9),
课程号 CHAR(5),
成绩 DECIMAL(4, 1),
CONSTRAINT p_xh_kch PRIMARY KEY (学号, 课程号)
);删除方法
基本语法:
ALTER TABLE <表名> DROP PRIMARY KEY;示例:
-- 删除 student 表的主键约束
ALTER TABLE student DROP PRIMARY KEY;FOREIGN KEY 约束
FOREIGN KEY 指代外键,外键的值必须是另一个表中某个字段已有的值,这表示一种参照关系(如“选课表”的学号需要参照“学生表”的学号)。与主键不同,外键的值可以为NULL 。
创建方法
基本语法:
[ CONSTRAINT <约束名> ]
FOREIGN KEY ( 字段名 [,…] )
REFERENCES 引用表名 ( 引用表字段名 [,…] )示例:
-- 为“学号”和“课程号”添加外键约束
CREATE TABLE sc (
学号 CHAR(9),
课程号 CHAR(5),
成绩 DECIMAL(4, 1),
CONSTRAINT f_xh FOREIGN KEY (学号) REFERENCES student(学号),
CONSTRAINT f_kch FOREIGN KEY (课程号) REFERENCES course(课程号)
);删除方法
基本语法:
ALTER TABLE <表名> DROP FOREIGN KEY <约束名>;示例:
ALTER TABLE sc DROP FOREIGN KEY f_xh; UNIQUE 约束
UNIQUE 指代唯一值。有唯一值约束的字段不允许出现重复值。
创建方法
创建 UNIQUE 约束有两种方法:
直接在每条字段定义之后声明。这种方式不能指定约束的名称。
使用单独的子句声明。这种方式可以指定约束的姓名。
基本语法:
-- 方法二
[ CONSTRAINT <约束名> ] UNIQUE ( 字段名 [,…] )示例:
-- 方法一:直接追加在字段之后
CREATE TABLE student (
学号 CHAR(9),
姓名 VARCHAR(10),
身份证号 CHAR(18) UNIQUE
);
-- 方法二:单独创建
CREATE TABLE student (
学号 CHAR(9),
姓名 VARCHAR(10),
身份证号 CHAR(18),
CONSTRAINT u_sfz UNIQUE (身份证号)
);删除方法
基本语法:
ALTER TABLE <表名> DROP KEY <约束名>;示例:
ALTER TABLE student DROP KEY u_sfz; NOT NULL 约束
NOT NULL 指代非空。有非空约束的字段的值不允许为 NULL 。
创建方法
直接在每条字段定义之后声明。
基本语法:
<字段名> <数据类型> [ NOT NULL | NULL ]示例:
-- 为“身份证号”添加非空约束
CREATE TABLE student (
学号 CHAR(9),
姓名 VARCHAR(10),
身份证号 CHAR(18) NOT NULL
);修改和删除方法
基本语法:
ALTER TABLE <表名> MODIFY <字段名> <数据类型> [ NOT NULL | NULL ];示例:
-- 设为可空(相当于删除 NOT NULL 约束)
ALTER TABLE student MODIFY 身份证号 CHAR(18) NULL;
-- 设为非空
ALTER TABLE student MODIFY 身份证号 CHAR(18) NOT NULL;事实上,创建表时如果字段不声明为
NOT NULL(不可空),则会默认声明为NULL(即可空)。
DEFAULT 约束
DEFAULT 指代默认值。在插入数据时,如果没有向某个字段指定值,那么 MySQL 就会把这个字段的默认值作为新记录的值。
若字段未声明
DEFAULT约束,则表示默认值为NULL。
创建方法
直接在每条字段定义之后声明。
基本语法:
<字段名> <数据类型> DEFAULT 默认值表达式示例:
-- 建表时,为“政治面貌”字段设置默认值
CREATE TABLE student (
学号 CHAR(9),
姓名 VARCHAR(10),
政治面貌 VARCHAR(8) DEFAULT '共青团员'
);修改和删除方法
基本语法:
ALTER TABLE t_student ALTER COLUMN <字段名> SET DEFAULT 默认表达式;示例:
-- 修改“政治面貌”字段的默认值
ALTER TABLE t_student ALTER COLUMN 政治面貌 SET DEFAULT '共青团员';
-- 删除默认值,即默认为NULL
ALTER TABLE t_student ALTER COLUMN 政治面貌 SET DEFAULT NULL;CHECK 约束
在 SQL 中, CHECK 指代检查。检查约束用于审核字段的值是否正确。
创建方法(不存在的)
请注意,以下语法可以正常执行,但其实什么事都不会发生,并不会真的创建了 CHECK 约束 😒😒😒 。
基本语法:
[CONSTRAINT <约束名>] CHECK (逻辑表达式)示例:
-- 建表时添加约束
CREATE TABLE sc (
学号 CHAR(9),
课程 CHAR(5),
成绩 DECIMAL(4, 1),
CONSTRAINT c_score CHECK (成绩 BETWEEN 0 AND 100)
);
-- 建表后添加约束
ALTER TABLE sc
ADD CONSTRAINT c_score
CHECK (成绩 BETWEEN 0 AND 100);最后更新于
这有帮助吗?