如何在MySQL的CREATE TABLE语句中为列创建索引?能否在CREATE TABLE语句内为非唯一email列创建索引?
MySQL CREATE TABLE 时创建索引的完整指南
嘿,针对你提出的两个MySQL索引问题,我来给你详细捋清楚:
1. 如何在执行CREATE TABLE命令时为列创建索引?
在CREATE TABLE语句里创建索引有几种常见方式,根据索引类型不同写法略有区别:
主键索引:直接在列定义后加
PRIMARY KEY,如果是多列组合的复合主键,也可以在表定义的最后统一声明-- 单列主键(你已经用到的写法) CREATE TABLE addresses ( phone_number VARCHAR(12) PRIMARY KEY, email TINYTEXT ); -- 复合主键(多列组合) CREATE TABLE orders ( order_id INT, user_id INT, PRIMARY KEY (order_id, user_id) );普通非唯一索引:有两种写法,一种是在列定义后加
KEY或INDEX(MySQL里两者是同义词),另一种是在表末尾统一声明索引(推荐这种,更清晰,还能自定义索引名方便后续维护)-- 方式1:列定义后直接加 CREATE TABLE addresses ( phone_number VARCHAR(12) PRIMARY KEY, email TINYTEXT KEY ); -- 方式2:表末尾统一声明(推荐) CREATE TABLE addresses ( phone_number VARCHAR(12) PRIMARY KEY, email TINYTEXT, INDEX idx_email (email) -- idx_email是自定义索引名 );唯一索引:如果需要确保列值唯一,用
UNIQUE KEY或UNIQUE INDEX即可CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50) UNIQUE KEY, email TINYTEXT, UNIQUE INDEX idx_user_email (email) );复合索引:针对多列组合创建索引,在表末尾声明即可
CREATE TABLE products ( id INT PRIMARY KEY, category_id INT, price DECIMAL(10,2), INDEX idx_category_price (category_id, price) );
2. 是否可以在CREATE TABLE语句内为非唯一的email列创建索引?
当然可以!你想替代先建表再ALTER TABLE的操作完全可行,但你写的email TINYTEXT INDEX语法有误,MySQL不支持这种格式。
正确的写法有两种,效果和你原来的两步操作完全一致,还能避免后续修改表结构的开销:
写法一:在列定义后加KEY(或INDEX)
CREATE TABLE addresses ( phone_number VARCHAR(12) PRIMARY KEY, email TINYTEXT KEY );
写法二:在表末尾显式声明索引(推荐,可指定索引名)
CREATE TABLE addresses ( phone_number VARCHAR(12) PRIMARY KEY, email TINYTEXT, INDEX idx_email (email) );
这两种写法都会创建一个针对email列的非唯一索引,和你执行ALTER TABLE addresses ADD INDEX (email);的结果完全相同。
内容的提问来源于stack exchange,提问作者HyperActive
相关产品推荐
相关产品推荐

