目录
通过约束,让未来插入数据库表中的数据是符合预期的,保证数据的完整性与可预期性。
一、空属性约束 null
可以为某一列选择必填(not null)与非必填(null)
create table 表名 (列名 列属性 [null || not null]);
mysql> create table test1( -> col1 int null, -> col2 int not null);
Query OK, 0 rows affected (0.24 sec)
在插入时,
二、默认值 default
2.1 基本语法
如果插入数据时未插入该列,mysql会自动填充建表时设置的默认值(default)
create table 表名 (列名 列属性 [default(N)]);
mysql> create table test2(
-> col1 int default(100),
-> col2 int default(50),
-> col3 int);
Query OK, 0 rows affected (0.19 sec)
在插入时, 有默认值未被插入的列被初始化为默认值 有默认值且被插入的列可以正常赋值 无默认值且未被插入的列被初始化为NULL,见下图
只对col3进行插入,可以看到col1与col2被赋初始值:
对有默认值的列进行赋值可以覆盖默认值:
2.2 not null 与 default
若设为not null列但是同时有default时,不进行插入数据是否会报错?
不能插入非法信息但可以不进行插入,not null列会使用default填充
default与not null互相补充:前者用户省略该列时,若设置默认值则使用默认值,否则直接报错;后者当用户需要插入时不允许用户插入NULL。
三、列描述 comment
简单来说,列描述是给另一个开发者阅读的,以让其理解该列设置的意义
语法:comment'列描述内容 '
四、零填充 zerofill
当不满足规定长度时,会用零填充高位并自动将该列设置为unsigned
语法:int(N)
当将列num1修改为int(10)后,表中的数据不满10位的高位用0填充:
查看表中数据时是等宽列:
五、主键 primary key
标识表中列的唯一性,如生活中的身份证号、学号,如果设置主键则自动添加not null约束
语法: create table 表名( 列名 数据类型 primary key);
去除主键:alter table 表名 drop primary key;
新加主键:alter table 表名 add primary key (列名);
不允许向主键列添加重复值:
如果向原来没有主键的表新加主键,则需要先删除重复值:
主键可以指定多列属性,只有当多列与历史数据都相同是才会ERROR:
语法:primary key(col1, col2)
六、自增值 auto_increment
自增长的值,默认从1开始,自增列必须是主键列!
建表语句auto_increment = xx; (从xx开始自增)
七、唯一键 unique key
主键:主键的主要目的是唯一标识表中的每一行,通常作为表之间进行外键关联时的基础。
唯一键:唯一键的主要目的是保证表中的某些列的数据唯一性,不一定用作行标识。
在上面的例子中,id 是主键,保证每个用户有唯一的标识。而 username 是唯一键,保证用户名不能重复。
八、外键 foreign key
8.1 基本语法
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
语法:foreign key (字段名) references 主表(列)
8.2 外键例子
假设有两个表:orders
(订单表)和 customers
(顾客表)。每个订单都属于一个顾客,因此可以在 orders
表中创建一个外键,指向 customers
表的主键 customer_id
。
8.2.1 创建 customs 表
首先创建一个 customers
表,包含顾客的唯一标识 customer_id
和顾客的名称:
mysql> CREATE TABLE customers (
-> customer_id INT PRIMARY KEY, -- 主键
-> customer_name VARCHAR(100) NOT NULL
-> );
Query OK, 0 rows affected (0.12 sec)
8.2.2 创建 orders 表
接下来创建一个 orders
表,其中 order_id
是订单的唯一标识,而 customer_id
则通过外键约束与 customers
表中的 customer_id
相关联:
mysql> CREATE TABLE orders (
-> order_id INT PRIMARY KEY, -- 主键
-> order_date DATE NOT NULL,
-> customer_id INT, -- 外键字段,指向 customers 表的主键
FERENCES customers (customer_id)
ON DELETE CASCADE -- 级联删除,如果顾客被删除,相关订单也会被删除
ON UPDATE CASCADE -- 级联更新,如果顾客 ID 更新,订单表的关联也会更新
);
-> FOREIGN KEY (customer_id) -- 定义外键约束
-> REFERENCES customers (customer_id)
-> ON DELETE CASCADE -- 级联删除,如果顾客被删除,相关订单也会被删除
-> ON UPDATE CASCADE -- 级联更新,如果顾客 ID 更新,订单表的关联也会更新
-> );
Query OK, 0 rows affected (0.37 sec)
外键约束的说明:
customer_id
是外键:它引用了customers
表的customer_id
列ON DELETE CASCADE
:如果在customers
表中删除某个顾客,其对应的所有订单也会被删除ON UPDATE CASCADE
:如果customers
表中的某个顾客 ID 被更新,对应的orders
表中的customer_id
也会同步更新
示例数据插入
1. 向 customers
表插入顾客数据:
mysql> INSERT INTO customers (customer_id, customer_name)
-> VALUES (1, 'Alice'), (2, 'Bob');
Query OK, 2 rows affected (0.07 sec)
Records: 2 Duplicates: 0 Warnings: 0
2. 向 orders
表插入订单数据:
mysql> INSERT INTO orders (order_id, order_date, customer_id)
-> VALUES (101, '2024-10-12', 1),
-> (102, '2024-10-13', 2);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
在这里,order_id 101
属于 customer_id 1
的顾客(Alice),order_id 102
属于 customer_id 2
的顾客(Bob)。
总结
通过外键约束,orders
表中的 customer_id
与 customers
表中的 customer_id
建立了关联。如果你删除某个顾客,相关的订单也会被删除;如果更新顾客的 ID,订单中的 customer_id
也会相应更新。这就是外键约束的强大之处,能够确保数据的完整性和一致性。