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 也会相应更新。这就是外键约束的强大之处,能够确保数据的完整性和一致性。

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值