MySQL——表的约束

目录

一、空属性约束 null

二、默认值 default

2.1 基本语法

2.2 not null 与 default

三、列描述 comment

四、零填充 zerofill

五、主键 primary key

六、自增值 auto_increment

七、唯一键 unique key

八、外键 foreign key

8.1 基本语法

8.2 外键例子

8.2.1 创建 customs 表 

8.2.2 创建 orders 表

外键约束的说明:

示例数据插入

总结


通过约束,让未来插入数据库表中的数据是符合预期的,保证数据的完整性与可预期性。

一、空属性约束 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_idcustomers 表中的 customer_id 建立了关联。如果你删除某个顾客,相关的订单也会被删除;如果更新顾客的 ID,订单中的 customer_id 也会相应更新。这就是外键约束的强大之处,能够确保数据的完整性和一致性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值