创建和操纵表与约束
目录
创建表(CREATE TABLE)
指定默认值(DEFAULT)
修改表结构(ALTER TABLE)
删除表(DROP TABLE)
重命名表(RENAME TABLE)
约束(Constraint)
主键(Primary Key)
外键(Foreign Key)
唯一约束(UNIQUE)
创建表(CREATE TABLE)
语法结构:
CREATE TABLE 表名 ( 列名1 数据类型 [列约束], 列名2 数据类型 [列约束], ...);
注意最后一个字段的末尾不能加逗号
创建一个名为 vendors 的供应商信息表,要求包含以下字段:
供应商 ID:整数类型,作为主键
供应商名称:字符串类型(最长 50 个字符),不允许为空
供应商地址:字符串类型(最长 100 个字符),允许为空
CREATE TABLE vendors ( vend_id INT PRIMARY KEY, vend_name VARCHAR(50) NOT NULL, vend_address VARCHAR(100), vend_phone VARCHAR(20) );
varchar是什么?
varchar 是 SQL 中用来存储字符串的一种数据类型。
它的特点是可变长度,比如定义 varchar(50),表示这个字段最多能存 50 个字符,但如果实际内容只有 10 个字符,就只占 10 个字符的空间,不会浪费多余的存储空间。
为什么使用varchar?
比如存储姓名,如果用固定长度的类型(比如 char(10)),不管名字长短都会占 10 个字符的空间,会浪费很多存储;而用 varchar(10),多长的名字就占多少空间,更节省。
NULL 表示 没有值 或 未知值,即 数据不存在 或 无法确定具体内容。
就像问别人 明天吃什么?,对方回答 还没想好,此时无法确定具体答案,用 NULL 表示。
空字符串表示 有值,但值为空,即 数据存在,但内容为空。如果问别人 今天吃了什么?对方回答 没吃,此时明确回答了 没吃,用空字符串表示。
指定默认值(DEFAULT)
如果插入时未提供值,使用默认值
在列定义中使用 DEFAULT 关键字设置默认值
vend_name VARCHAR(50) NOT NULL DEFAULT \'苹果科技\'
修改表结构(ALTER TABLE)
添加列语法结构(ADD)
ALTER TABLE 表名ADD 列名 数据类型 [约束];
要求:向 vendors 表中添加一个新的字段
供应商的电子邮箱:字符串类型(最长 100 个字符),允许为空
ALTER TABLE vendorsADD vend_email VARCHAR(100);
删除列语法结构(DROP COLUMN)
ALTER TABLE 表名DROP COLUMN 列名;
要求:删除 vend_email 字段
ALTER TABLE vendorsDROP COLUMN vend_email;
删除表(DROP TABLE)
语法结构:
DROP TABLE 表名;
重命名表(RENAME TABLE)
语法结构:
RENAME TABLE 原表名 TO 新表名;
要求:将 vendors 表重命名为 vendors2025
RENAME TABLE vendors TO vendors2025;
约束(Constraint)
约束是对表中数据插入、修改、删除时的一种限制或规则,用于确保数据库的准确性和一致性,保障数据完整性。
主键(Primary Key)
主键是约束的一种,用于唯一标识表中的每一行。主键值必须唯一且不可为空。
每张表只能定义一个主键,但这个主键可以由多个列组合而成,称为复合主键。
列级主键
列级主键是直接在字段定义后声明该字段为主键,适用于单个字段作为主键的场景。
CREATE TABLE vendors ( vend_id INT PRIMARY KEY, -- 列级主键 vend_name VARCHAR(50) NOT NULL, vend_address VARCHAR(100), vend_phone VARCHAR(20));
PRIMARY KEY 的定义本身包含了 NOT NULL 的特性,所以可以省略 NOT NULL
表级主键
表级主键是在所有字段定义完成后,单独通过PRIMARY KEY子句声明主键,适用于多个字段组合作为主键(复合主键)的场景。
要求:用 vend_name 和 vend_phone 组合唯一标识供应商
CREATE TABLE vendors ( vend_id INT, vend_name VARCHAR(50) NOT NULL, vend_address VARCHAR(100), vend_phone VARCHAR(20) NOT NULL, -- 表级声明复合主键 PRIMARY KEY (vend_name, vend_phone));
使用ALTER TABLE添加主键
如果表创建时未设置主键,后续可以通过 ALTER TABLE 语句添加主键。
语法结构:
ALTER TABLE 表名ADD PRIMARY KEY (字段名1, 字段名2, ...);
用 ALTER TABLE 添加主键的前提是 vend_id 字段无重复值且不为NULL
ALTER TABLE vendorsADD PRIMARY KEY (vend_id);
去除表中的主键约束
ALTER TABLE 表名DROP PRIMARY KEY;
因为一个表只能有一个主键,所以删除时不需要指定具体字段
删除主键前先确保该主键没有被其他表的外键关联,否则会删除失败(需要先删除关联表的外键约束)
外键(Foreign Key)
外键是关系型数据库中的一种约束,用于建立和维护两个表之间的引用关系,外键是实现参照完整性的核心机制。
外键是某张表中的一列(或多列),它引用了另一张表的主键或唯一约束列。
外键所在的表称为从表,外键引用的表称为主表
外键的作用就是保证从表中的某列值必须来自主表中的一列已有值。
参照完整性
参照完整性是数据库中的一种数据完整性规则,它确保当一个表中的数据引用另一个表的主键时,该引用是有效的、存在的、正确的。
换句话说:
从表中某字段引用主表的主键,那么这条引用必须指向主表中真实存在的数据,否则就是“悬空引用”或“脏数据”,违反了参照完整性。
创建顾客表:四个字段分别是顾客ID,顾客名称,顾客联系方式,顾客邮箱
CREATE TABLE customers ( cust_id INT PRIMARY KEY, cust_name VARCHAR(50) NOT NULL, cust_contact VARCHAR(50), cust_email VARCHAR(50) );
创建订单表:三个字段分别是订单编号,订单日期,顾客ID
CREATE TABLE orders ( order_num INT PRIMARY KEY, order_date DATE NOT NULL, cust_id INT );
上面的表中,orders 表的 cust_id 可以作为外键,关联 customers 表的 cust_id(主键),表示订单属于哪个顾客。
orders表中不能出现 customers 表中不存在的 cust_id,即不允许存在无主订单
换句话说:
订单表引用了客户表的客户 ID,那么订单表中出现的客户 ID,必须在客户表中存在,是参照完整性的体现。
列级外键
在从表的字段定义后直接声明外键,适用于单个字段作为外键的场景。
CREATE TABLE orders ( order_num INT PRIMARY KEY, order_date DATE NOT NULL, -- 列级声明外键 cust_id INT REFERENCES customers(cust_id));
REFERENCES customers(cust_id) 表示:orders.cust_id的值必须来自customers.cust_id的已存在值。
表级外键
在所有字段定义完成后,通过 FOREIGN KEY 子句单独声明,适用于复合外键(多个字段组合作为外键)或需要给外键命名的场景。
表级声明外键的语法结构:
-- 外键声明部分[CONSTRAINT 外键名称] -- 可选:给外键命名FOREIGN KEY (从表外键字段) -- 指定从表中作为外键的字段REFERENCES 主表名(主表被参照字段) -- 指定关联的主表及主表中的字段(主键或唯一键)[ON DELETE 级联规则] -- 可选:主表记录删除时的联动规则[ON UPDATE 级联规则] -- 可选:主表被参照字段更新时的联动规则
外键可以不命名,数据库会自动生成一个默认名称,在MySQL中,默认名称格式为 fk_从表名_从表外键字段名
CREATE TABLE orders ( order_num INT PRIMARY KEY, order_date DATE NOT NULL, cust_id INT, -- 表级声明外键 CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers(cust_id));
创建表后添加外键
如果表已创建,可以通过 ALTER TABLE 语句添加外键。
语法结构:
ALTER TABLE 从表名ADD CONSTRAINT 外键名称FOREIGN KEY (从表外键字段)REFERENCES 主表名(主表主键字段);
要求:给已存在的orders表添加外键,关联customers表
ALTER TABLE ordersADD CONSTRAINT fk_orders_customersFOREIGN KEY (cust_id)REFERENCES customers(cust_id);
删除外键
语法结构:
ALTER TABLE 从表名DROP FOREIGN KEY 外键名称;
要求:删除之前添加的外键 fk_orders_customers
ALTER TABLE ordersDROP FOREIGN KEY fk_orders_customers;
外键的级联操作
当主表中的主键值被修改或删除时,从表中依赖它的外键值该如何处理?
可以通过级联操作定义规则,避免数据不一致。
常用级联选项:
唯一约束(UNIQUE)
唯一约束用于保证列(或列组合)中的数据是唯一的,与主键不同的是:
列级唯一约束
CREATE TABLE customers ( cust_id INT PRIMARY KEY, cust_name VARCHAR(50) NOT NULL, cust_email VARCHAR(50) UNIQUE, -- 列级唯一约束 cust_phone VARCHAR(20));
表级唯一约束
通过 CONSTRAINT 命名约束,适用于单个字段或复合字段。
CREATE TABLE customers ( cust_id INT PRIMARY KEY, cust_name VARCHAR(50) NOT NULL, cust_email VARCHAR(50), cust_phone VARCHAR(20), -- 表级声明:单个字段唯一 CONSTRAINT uk_cust_email UNIQUE (cust_email), -- 表级声明:复合字段唯一 CONSTRAINT uk_name_phone UNIQUE (cust_name, cust_phone));
创建表后唯一约束
-- 对单个字段添加ALTER TABLE customersADD CONSTRAINT uk_cust_email UNIQUE (cust_email);-- 对复合字段添加ALTER TABLE customersADD CONSTRAINT uk_name_phone UNIQUE (cust_name, cust_phone);
删除唯一约束
要求:删除名为 uk_cust_email 的唯一约束
ALTER TABLE customersDROP CONSTRAINT uk_cust_email;