主键 primary key的两种分类和创建语法

MySQL主键详解
本文深入解析MySQL中的主键约束,包括单字段主键与多字段主键(复合主键)的概念及创建语法,为数据库设计提供实用指导。

主键 primary key的两种分类和创建语法

主键 primary key
MySQL中主键约束分为两种。
单字段主键
多字段主键(复合主键)


单字段主键创建语法:

create table table1 (
id int primary key aito_increment,
name varchar(20),
score float)
多字段字段主键创建语法:
create table table1 (
id int aito_increment,
name varchar(20),
courseid int,
score float,
primary key(id,courseid)
)
<think> 我们正在讨论Doris的主键模型(Primary Key Model)中的PRIMARY KEY (id)用法。Doris的主键模型是用于支持实时更新删除操作的一种表结构设计。在创建表时,通过指定PRIMARY KEY来定义主键列,这些列的组合必须唯一标识每一行,并且用于数据更新删除时的定位。 注意:在Doris中,主键模型要求主键列不能为NULL,且主键列的值不能更新(但非主键列可以更新)。此外,主键模型表在创建时还需要指定一个特殊的属性,即使用UNIQUE KEY并配合PRIMARY KEY语法创建主键模型表的语法示例: CREATE TABLE table_name ( id INT, name VARCHAR(50), value INT, PRIMARY KEY (id) -- 这里指定id为主键 ) ENGINE=OLAP UNIQUE KEY(id) -- 注意:主键模型使用UNIQUE KEY来声明主键列 DISTRIBUTED BY HASH(id) BUCKETS 10 PROPERTIES ( "replication_num" = "3", "enable_persistent_index" = "true" -- 可选,用于持久化索引以加速重启 ); 特点: 1. 主键唯一:主键列(或列组合)的值必须唯一,如果插入相同主键的数据,则视为更新操作(根据非主键列的值覆盖原有行)。 2. 支持更新删除:通过INSERT语句使用相同主键来更新数据,或者使用DELETE FROM语句根据主键删除数据。 3. 存储优化:主键模型使用Delete+Insert的方式,在底层存储上标记删除旧版本并插入新版本。通过 compaction 过程合并数据,减少冗余。 注意事项: - 主键列不能为NULL,且不能更新(即不能通过UPDATE语句修改主键列的值,但可以通过先删除再插入实现主键值的变更)。 - 主键列的数量长度会影响存储查询效率,建议使用整数类型或较短的字符串类型作为主键。 - 主键模型表在查询时,会自动过滤掉被标记删除的旧版本数据,只返回最新版本。 - 主键模型表在创建时可以指定是否启用持久化索引(enable_persistent_index),启用后可以加快BE重启时的加载速度,但会增加磁盘空间使用。 使用场景:适用于需要实时更新、删除,且需要保证主键唯一性的场景,如用户资料表、订单状态表等。 示例操作: 1. 插入数据:INSERT INTO table_name (id, name, value) VALUES (1, 'Alice', 100); 2. 更新数据:插入相同主键的数据,如INSERT INTO table_name (id, name, value) VALUES (1, 'Alice', 200); 则原主键为1的行中value被更新为200。 3. 删除数据:DELETE FROM table_name WHERE id=1; 性能优化建议: - 合理设置分桶数(BUCKETS)分桶列(通常选择主键列),以均匀分布数据。 - 如果主键列很长,可以考虑使用md5等函数将其转换为固定长度的值,但需注意哈希冲突。 问题:主键模型表是否支持部分更新(即只更新部分列)? 答案:支持。在INSERT时,可以只指定部分列(主键列必须指定),其他未指定的列会被更新为默认值(如果有默认值)或NULL(如果允许NULL)。但注意,这会导致其他列被覆盖。如果需要保留其他列的值,则必须在INSERT语句中显式指定这些列。 另外,Doris还支持通过Stream Load、Broker Load等方式导入数据到主键模型表,并且也支持事务(通过BEGIN/COMMIT/ROLLBACK)。 关于主键模型的更多详细内容,可以参考Doris官方文档。 现在,根据要求,生成相关问题: </think> ### Doris 主键模型中的 `PRIMARY KEY (id)` 详解 #### 1. **基本概念** 在 Doris 的主键模型(Unique Key Model)中,`PRIMARY KEY (id)` 用于显式定义表的主键主键列需满足: - **唯一性**:主键值必须唯一(相同主键的写入视为更新)。 - **非空**:主键列不允许 `NULL` 值。 - **高效查询**:主键作为查询条件时,可直接定位数据[^1]。 #### 2. **使用方法** ##### (1) 建表示例 ```sql CREATE TABLE user_behavior ( `id` BIGINT NOT NULL, -- 主键列必须 NOT NULL `user_id` VARCHAR(50), `action` VARCHAR(20), `timestamp` DATETIME ) ENGINE=OLAP UNIQUE KEY(`id`) -- 声明主键 DISTRIBUTED BY HASH(`id`) BUCKETS 10 PROPERTIES ( "replication_num" = "3", -- 副本数 "enable_persistent_index" = "true" -- 持久化索引(推荐) ); ``` > **注意**:Doris 使用 `UNIQUE KEY` 语法定义主键,而非标准 SQL 的 `PRIMARY KEY`[^2]。 ##### (2) 数据写入与更新 - **插入/更新**:相同 `id` 的多次写入自动合并为最新版本(无需 `UPDATE` 语句): ```sql INSERT INTO user_behavior VALUES (1, 'userA', 'click', '2023-10-01 10:00:00'); INSERT INTO user_behavior VALUES (1, 'userA', 'purchase', '2023-10-01 11:00:00'); -- 覆盖旧数据 ``` - **删除**:通过主键删除指定行: ```sql DELETE FROM user_behavior WHERE id = 1; ``` #### 3. **核心特点** | **特性** | **说明** | |------------------|--------------------------------------------------------------------------| | **实时更新** | 主键相同的数据自动覆盖旧版本,支持高并发更新[^1] | | **高效查询** | 主键查询直接定位到具体行(时间复杂度 $O(1)$) | | **存储优化** | 后台 Compaction 自动合并数据版本,减少存储冗余 | | **事务支持** | 配合 Stream Load 或事务接口,保证写入原子性 | #### 4. **注意事项** ##### (1) 主键设计原则 - **短而高效**:优先使用整型(`BIGINT`/`INT`)或短字符串,避免长文本(如 `TEXT`)。 - **业务无关性**:避免使用频繁更新的列(如 `status`),主键值不可修改。 - **分桶优化**:使用 `DISTRIBUTED BY HASH(id)` 确保数据均匀分布。 ##### (2) 性能调优 - **持久化索引**:启用 `"enable_persistent_index"="true"` 加速 BE 重启[^2]。 - **Compaction 策略**:调整 `cumulative_compaction_num_threads` 参数控制合并速度。 - **避免热点**:若主键单调递增(如自增 ID),改用 `DISTRIBUTED BY RANDOM` 分散写入压力。 ##### (3) 限制 - **列数量限制**:主键最多包含 16 列,总长度 ≤ 128 字节[^1]。 - **不支持修改**:建表后无法更改主键列定义。 - **聚合模型不兼容**:主键模型 (`UNIQUE KEY`) 与聚合模型 (`AGGREGATE KEY`) 互斥。 #### 5. **适用场景** - **实时数仓**:需要频繁更新的用户画像表、订单状态表。 - **高并发点查**:主键精确查询(如用户 ID 查详情)。 - **CDC 数据同步**:从 MySQL数据库同步带有主键的变更数据。 #### 6. **与 Duplicate 模型对比** | **场景** | **主键模型** | **Duplicate 模型** | |------------------|----------------------------------------|----------------------------------| | 数据更新 | ✅ 支持覆盖更新 | ❌ 仅追加 | | 存储效率 | ⚠️ 需 Compaction 清理旧版本 | ✅ 无冗余 | | 查询性能 | ✅ 主键查询极快 | ⚠️ 需全表扫描过滤 | | 日志类数据 | ❌ 不适用 | ✅ 天然适合 | --- ### 相关问题 1. Doris 主键模型如何实现数据更新的底层机制? 2. 主键模型与 Duplicate 模型在存储结构上有何本质区别? 3. 如何处理主键模型因 Compaction 延迟导致的查询延迟? 4. 从 MySQL 同步数据到 Doris 主键模型的最佳实践是什么? 5. 如何监控主键模型表的 Compaction 状态性能瓶颈? [^1]: Doris 官方文档 - 数据模型: https://doris.apache.org/docs/data-table/data-model [^2]: Doris 主键模型设计解析: https://doris.apache.org/blog/unique-key-data-model-in-doris
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值