1. 表的约束概述
数据库中的数据类型提供了基础的约束,但不足以应对复杂业务逻辑。为了确保数据的合法性和正确性,需要使用额外的约束条件。常见的约束包括:NOT NULL、DEFAULT、COMMENT、ZEROFILL、PRIMARY KEY、AUTO_INCREMENT、UNIQUE KEY、FOREIGN KEY等。
1.1 空属性(NOT NULL)
字段默认可以为 NULL,但在实际业务中,建议尽量设置为 NOT NULL,因为 NULL 值无法参与运算。

示例:创建一个班级表,包含班级名和班级所在的教室。
CREATE TABLE myclass (
class_name VARCHAR(20) NOT NULL,
class_room VARCHAR(10) NOT NULL
);

插入数据时必须提供班级名和教室,否则会报错。
1.2 默认值(DEFAULT)
当插入数据时未指定某字段的值,可以使用默认值。
示例:
CREATE TABLE tt10 (
name VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED DEFAULT 0,
sex CHAR(2) DEFAULT '男'
);
INSERT INTO tt10 (name) VALUES ('zhangsan');

结果:age 自动为 0,sex 自动为 '男'。
1.3 列描述(COMMENT)
COMMENT 用于描述字段的含义,便于开发人员或DBA理解表结构。
示例:
CREATE TABLE tt12 (
name VARCHAR(20) NOT NULL COMMENT '姓名',
age TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄',
sex CHAR(2) DEFAULT '男' COMMENT '性别'
);

通过 SHOW CREATE TABLE tt12; 可以查看注释信息。
1.4 填充零(ZEROFILL)
当字段设置为 ZEROFILL 时,显示时会用0补齐到指定宽度。
示例:
CREATE TABLE tt3 (
a INT(5) ZEROFILL,
b INT(5)
);
INSERT INTO tt3 VALUES (1, 2);
SELECT * FROM tt3;

注意:ZEROFILL 仅影响显示格式,不影响存储值。
1.5 主键(PRIMARY KEY)
主键用于唯一标识一条记录,字段值必须唯一且非空。
示例:
CREATE TABLE tt13 (
id INT UNSIGNED PRIMARY KEY,
name VARCHAR(20) NOT NULL
);

复合主键:
CREATE TABLE tt14 (
id INT UNSIGNED,
course CHAR(10),
score TINYINT UNSIGNED DEFAULT 60,
PRIMARY KEY (id, course)
);
插入时,id 和 course 的组合必须唯一。

添加/删除主键:
ALTER TABLE tt13 ADD PRIMARY KEY (id);
ALTER TABLE tt13 DROP PRIMARY KEY;

1.6 自增长(AUTO_INCREMENT)
CREATE TABLE tt21 (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10) NOT NULL DEFAULT ''
);
INSERT INTO tt21 (name) VALUES ('a'), ('b');
SELECT * FROM tt21;

获取上次插入的ID:
SELECT LAST_INSERT_ID();

索引
1.7 唯一键(UNIQUE KEY)
保证字段值唯一,但允许为 NULL,且多个 NULL 不视为重复。一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。
示例:
CREATE TABLE student (
id CHAR(10) UNIQUE COMMENT '学号',
name VARCHAR(10)
);
INSERT INTO student (id, name) VALUES ('01', 'aaa');
INSERT INTO student (id, name) VALUES (NULL, 'bbb');
INSERT INTO student (id, name) VALUES ('01', 'ccc');

1.8 外键(FOREIGN KEY)
示例:
foreign key (字段名) references 主表(列)
CREATE TABLE myclass (
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL
);
CREATE TABLE stu (
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
class_id INT,
FOREIGN KEY (class_id) REFERENCES myclass(id)
);

插入数据时,class_id 必须在 myclass(id) 中存在,或为 NULL。
1.9 综合案例:商城数据库设计
需求:
商品表(goods)
客户表(customer)
购买记录表(purchase)
SQL实现:
CREATE DATABASE IF NOT EXISTS bit32mall DEFAULT CHARACTER SET utf8;
USE bit32mall;
-- 商品表
CREATE TABLE IF NOT EXISTS goods (
goods_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品编号',
goods_name VARCHAR(32) NOT NULL COMMENT '商品名称',
unitprice INT NOT NULL DEFAULT 0 COMMENT '单价,单位分',
category VARCHAR(12) COMMENT '商品分类',
provider VARCHAR(64) NOT NULL COMMENT '供应商名称'
);
-- 客户表
CREATE TABLE IF NOT EXISTS customer (
customer_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '客户编号',
name VARCHAR(32) NOT NULL COMMENT '客户姓名',
address VARCHAR(256) COMMENT '客户地址',
email VARCHAR(64) UNIQUE KEY COMMENT '电子邮箱',
sex ENUM('男', '女') NOT NULL COMMENT '性别',
card_id CHAR(18) UNIQUE KEY COMMENT '身份证'
);
-- 购买记录表
CREATE TABLE IF NOT EXISTS purchase (
order_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '订单号',
customer_id INT COMMENT '客户编号',
goods_id INT COMMENT '商品编号',
nums INT DEFAULT 0 COMMENT '购买数量',
FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
FOREIGN KEY (goods_id) REFERENCES goods(goods_id)
);
532



被折叠的 条评论
为什么被折叠?



