MySQL中CREATE语法

本文详细介绍了SQL中的CREATE语句,包括其语法结构、各部分的功能解析,特别是针对临时表、表存在性的检查、列定义等内容进行了深入讲解,并对表选项如引擎、字符集等进行了说明。

初学数据库时,身为DDL的CREATE语句就是必修的,也可以说是最早接触的,可能很多人还是只清楚简单的CREATE TABLE table_name (…);我曾经也是如此,顶多知道括号后面可以跟一些引擎设置,字符集设置等等,这篇文章就是用来升华的,深入了解下CREATE基本语法。

一、语法

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
[(
COLUMN_DEFINITION,
...
)]
[TABLE_OPTIONS]
[SELECT_STATEMENT]

二、解析

(1)TEMPORARY
用于创建临时表,CREATE TEMPORARY TABLE table_name;这个临时表在当前会话结束或者连接断开后将自动消失。
临时表详细内容可见我的另一篇文章《MySQL中临时表(TEMPORARY)》

(2)IF NOT EXISTS
实际上就是在建表前加上一个判断,只有该表目前尚不存在时才执行CREATE TABLE操作。用此选项可以避免出现表已经存在无法再新建的错误。

(3)table_name
需要创建的表名。该表名必须符合标识符规则,通常的做法是在表名中仅使用字母、数字及下划线。

(4)COLUMN_DEFINITION
所创建的表中各列的相关属性定义。
语法如下:

column_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] 
[PRIMARY KEY]
| PRIMARY KEY (index_col_name,...) 
| KEY [index_name] (index_col_name,...) 
| INDEX [index_name] (index_col_name,...) 
| UNIQUE [INDEX] [index_name] (index_col_name,...) 
| [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...) 
[COMMENT reference_definition] 
or CHECK (expr) 

如上所示,列的相关属性定义语法内容相当丰富,这里就简单介绍下,后续可能会来补充,不熟悉的也可以自行查阅资料。
1)column_name:
表中列的名字。必须符合标识符规则,而且在表中要唯一。
2)type:
列的数据类型。有的数据类型需要指明长度n,并用括号括起。目前MySQL提供的数据类型详见MySQL进阶_列类型篇。
3)NOT NULL | NULL:
指定该列是否允许为空。如果既不指定NULL也不指定NOT NULL,列被认为指定了NULL。
4)DEFAULT default_value:
为列指定默认值。如果没有为列指定默认值,MySQL自动地分配一个。
如果列可以取NULL作为值,缺省值是NULL。
如果列被声明为NOT NULL,缺省值取决于列类型:
1、对于没有声明AUTO_INCREMENT属性的数字类型,缺省值是0。对于一个AUTO_INCREMENT列,缺省值是在顺序中的下一个值。
2、对于除TIMESTAMP的日期和时间类型,缺省值是该类型适当的“零”值。对于表中第一个TIMESTAMP列,缺省值是当前的日期和时间。
3、对于除ENUM的字符串类型,缺省是空字符串。对于ENUM,缺省值是第一个枚举值。
5)AUTO_INCREMENT:
设置该列有自增属性,只有整型列才能设置此属性。
当你插入NULL值或0到一个AUTO_INCREMENT列中时,列被设置为value+1,在这里value是此前表中该列的最大值。AUTO_INCREMENT顺序从1开始。每个表只能有一个AUTO_INCREMENT列,并且它必须被索引。

(5)TABLE_OPTIONS
设置表的一些属性定义:
1)引擎设置
例如:ENGINE|TYPE = MYISAM
2)字符集设置
例如:CHARACTER SET gbk
3)排序规则设置
例如:COLLATE gbk_chinese_ci
COLLATE是用来做什么的?
是用来排序的规则。对于mysql中那些字符类型的列,如VARCHAR,CHAR,TEXT类型的列,都需要有一个COLLATE类型来告知mysql如何对该列进行排序和比较。简而言之,COLLATE会影响到ORDER BY语句的顺序,会影响到WHERE条件中大于小于号筛选出来的结果,会影响DISTINCT、GROUP BY、HAVING语句的查询结果。另外,mysql建索引的时候,如果索引列是字符类型,也会影响索引创建,只不过这种影响我们感知不到。总之,凡是涉及到字符类型比较或排序的地方,都会和COLLATE有关。

(6)SELECT_STATEMENT

//如下直接通过select查询出指定数据存入新建的表中
CREATE TABLE ...
SELECT ...

参考自:
https://www.jb51.net/article/6257.htm

越努力,越强大,没有理由让自己停下。

### MySQL CREATE TABLE 语法与示例 在 MySQL 中,`CREATE TABLE` 语句用于创建新的数据库表。其基本语法如下: ```sql CREATE TABLE schemaname.tablename ( column_1 datatype(length) [NOT NULL | DEFAULT value | UNIQUE], column_2 datatype(length) [NOT NULL | DEFAULT value | UNIQUE], ... PRIMARY KEY (column_name), FOREIGN KEY (column_name) REFERENCES parent_table(column_name) ) ENGINE=storage_engine; ``` #### 基本字段说明 - **schemaname**: 数据库名称(可选)。 - **tablename**: 要创建的表的名称。 - **column_1, column_2**: 表中的列名。 - **datatype**: 列的数据类型,例如 `INT`, `VARCHAR`, `TEXT` 等。 - **length**: 数据类型的长度限制,例如 `VARCHAR(255)`[^1]。 - **NOT NULL**: 指定该列不能为 `NULL`。 - **DEFAULT value**: 设置默认值。 - **UNIQUE**: 确保列中的所有值都是唯一的。 - **PRIMARY KEY**: 主键约束,确保列中的值唯一且不为空。 - **FOREIGN KEY**: 外键约束,用于引用另一个表中的主键。 - **ENGINE=storage_engine**: 指定存储引擎,例如 `InnoDB`, `MyISAM`。 #### 示例:创建一个简单的用户表 以下是一个创建用户表的示例,包含用户 ID、用户名和电子邮件地址: ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE ) ENGINE=InnoDB; ``` 此示例中: - `id` 是自增的主键。 - `username` 和 `email` 都是唯一且不能为空的字段。 #### 使用 `CREATE TABLE LIKE` 创建结构相同的表 如果需要创建一个与现有表结构相同但不包含数据的新表,可以使用以下语法: ```sql CREATE TABLE new_table_name LIKE existing_table_name; ``` 例如,假设有一个名为 `employees` 的表,可以通过以下命令创建一个结构相同的空表 `new_employees`: ```sql CREATE TABLE new_employees LIKE employees; ``` 这样,`new_employees` 将具有与 `employees` 相同的结构,但没有任何数据[^2]。 #### 设置 AUTO_INCREMENT 的初始值 对于支持 `AUTO_INCREMENT` 的表,可以通过 `ALTER TABLE` 语句重新设置自增起始值: ```sql ALTER TABLE table_name AUTO_INCREMENT = n; ``` 例如,将 `users` 表的自增起始值设置为 100: ```sql ALTER TABLE users AUTO_INCREMENT = 100; ``` 这确保了新插入的记录从指定的值开始递增[^3]。 ### 注意事项 - 在定义主键时,必须确保该列的值唯一且不为空。 - 如果表中包含外键,需要确保引用的父表存在并且外键约束正确。 - 不同的存储引擎可能对某些特性有不同支持,例如 `InnoDB` 支持事务和外键,而 `MyISAM` 不支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值