非空约束确保列不接受NULL值
create table 表名(
字段名 not null,
......
);
例:
create table users(
id int not null,
name varchar(20)
);
#报错,id没有默认值,不允许为空
insert into users(name) values("李四");
alter table 表名
modify column 字段名 字段类型 not null;
例:
alter table employees
modify column name varchar(100) not null;
# 其中的 column 写不写都可以
注意:不要混淆NULL值和空串,NULL值就是没有值,空串是’'(两个单引号,中间没有字段)
default, 如果在插入行时没有给出值,通过default指定此时使用的默认值
create table 表名(
字段名 字段类型 default 默认值,
。。。
);
例:
create table users(
id int not null default 666,
name varchar(20)
);
#不报错 默认填充666
insert into users(name) values("李四");
select * from users;
# 修改已有字段
alter table users
MODIFY COLUMN status VARCHAR(10) DEFAULT 'active';
create table t1 (
content text default 'default text'
);
# 会报错,因为TEXT类型不能有默认值。
用于确保特定列或列组合的唯一性,被约束的列的值在整个表中是唯一的,唯一约束默认允许空值(null),因此多个空值不违反唯一约束
create table 表名(
字段名 字段类型 unique,
。。。
);
create table users (
id int primary key,
email varchar(100) unique,
username varchar(50),
phone varchar(20),
unique (username, phone)
/*
email:每个用户的邮箱唯一
(username, phone):用户的“用户名 + 电话号码”组合唯一(复合唯一)
*/
);
alter table users add unique (email);
alter table users add unique index unique_username_phone (username, phone);
删除唯一索引:
alter table 表名
drop index 约束名;
alter table 表名
drop key 约束名;
特点 | 主键(PRIMARY KEY) | 唯一约束(UNIQUE) |
---|---|---|
唯一性 | 必须唯一,且非空(NOT NULL) | 唯一,可以为空,但此行为依赖数据库版本和设置 |
数量限制 | 每个表只能有一个主键 | 可以有多个唯一约束 |
主要用途 | 表的标识,唯一标记每行 | 保证其他列值的唯一性 |
用途解释:
意思:特别是在有多个列组成的“复合唯一索引”或某个单列具有唯一约束时,是用来标识每一行数据的“唯一身份证”。
举例:
假设你有一个用户表,存放一些用户的信息:
id | 用户名 | 邮箱 | 手机号 |
---|---|---|---|
1 | 张三 | [email protected] | 13800138000 |
2 | 李四 | [email protected] | 13900139000 |
3 | 王五 | [email protected] | 13700137000 |
id 是每个用户的唯一编号,保证每一行数据都能唯一识别,没有重复的 id。
这样,如果要找到“李四”的信息,只需要用 id=2,就能唯一找到。
如果你规定“每个邮箱都必须唯一”,那么:
alter table users add unique (email);
目的:确保每条数据都可以唯一对应到一行,避免重复或混淆
简单理解:
“唯一标记每行”意味着:在表里,每一行有一个唯一的识别符(比如id),可以用来准确找到这条数据,不会搞混。
其他列(如邮箱)可以用来保证没有重复,是“内容的唯一性”要求。
意思:限制某些列((或列的组合))的值不能重复,用于确保数据的“唯一性”和“完整性”。
举例:
唯一标识表中每行的这个列(或这组列)称为主键。主键用来表示一个特定的行。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。
因此:
特点:
作用:
create table 表名(
字段名 字段类型 primary key,
....
);
创建表时直接定义主键
create table users (
id int primary key,
username varchar(50),
email varchar(100)
);
id字段就是表的主键,保证每个用户的ID都唯一,且不能为空。
定义多个字段组合为复合主键
create table enrollments (
student_id int,
course_id int,
enrollment_date date,
primary key (student_id, course_id)
);
修改表添加主键
alter table users add primary key (id);
删除主键
alter table 表名
drop primary key;
auto_increment: 设置ayto_increment的列,当每增加一行时自动增量,每个表只允许一个auto_increment列
create table users(
id int primary key auto_increment,
name varchar(20) unique
);
insert into users(name) values("李四");
insert into users(name) values("张三");
insert into users(id,name) values("王五")
insert into users(name) values("赵六");
特点 | 说明 |
---|---|
必须唯一 | 每行数据的主键值都不同 |
非空 | 不能为空 |
作用 | 标识和区分每一行,是数据关系和索引的基础 |
只能有一个主键 | 一个表只能有一个主键 |
外键为表中的某一字段,该字段是另一表的主键值,外键用来在两个表的数据之间建立联结,一个表中可以有一个或多个外键。外键的作用是保持数据的一致性、完整性。
注意:
例:
假设有两个表:orders(订单)和customers(客户)
create table customers (
customer_id int primary key,
name varchar(50)
);
订单表加入外键:
create table orders (
order_id int primary key,
customer_id int,
order_date date,
foreign key (customer_id) references customers(customer_id)
);
常用:
例;
foreign key (customer_id) references customers(customer_id)
on delete cascade
on update cascade
如果删除customers表中的某个customer_id,那么所有orders中对应这个customer_id的订单也会自动被删除。
如果修改customers表中某个customer_id的值(比如改ID),那么所有orders表中对应的外键也会自动同步更新为新的ID。
操作 | 作用 | 例子 |
---|---|---|
on delete cascade |
删除父表记录时,自动删除关联的子表记录 | 删除某个用户,订单自动删除 |
on update cascade |
更新父表主键时,自动更新子表对应的外键 | 改变用户ID,订单中的用户ID也随之变 |
方面 | 说明 |
---|---|
作用 | 保证两个表之间的关系数据完整性 |
依赖关系 | 引用的字段必须是被引用表的主键或唯一键 |
操作 | 支持级联删除/更新,保护数据一致性 |
多用场景 | 一对多关系(如订单与客户)、多对多关系的中介表设计等 |