【SQL篇章--CREATE TABLE】

【SQL篇章】【SQL语句梳理 :--基于MySQL5.6】【已梳理:CREATE TABLE】【会坚持完善】

SQL :

1. Data Definition Statements:

1.3 CREATE TABLE

格式:3种建表语句

1.简单SQL表明结构:

CREATE TABLE t7(id INT ,NAME VARCHAR(20), PRIMARY KEY(`id`)) ENGINE=INNODB;

格式:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options] [partition_options]

  

2.简单SQL表名结构:

CREATE TABLE t7(id INT,TIME TIMESTAMP) AS SELECT id,TIME FROM t1 ;

【备注】:MySQL5.6.9之后,若开启GTID模式,参数enforce_gtid_consistency=on会限制此种SQL的执行而报错。

格式:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [partition_options] [IGNORE | REPLACE] [AS] query_expression

  

3.简单SQL表明结构:

CREATE TABLE t7 like t1;

格式:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }

tb_name:

1.格式:

  tb1_name 或者 `tb1_name`

  db1.tb1_name 或者 `db1`.`tb1_name`

2.IF NOT EXISTS

  不存在时,创建。避免表名重复出现错误。

data_type

  1.AUTO_INCREMENT只用于:integer和floating point.不用于:BLOD和TEXT类型。

  2. 字符数据类型:(CHARVARCHARTEXT),包括:CHARACTER SET and COLLATE的设置

  eg:CREATE TABLE t1 (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);

  3.对于CHARVARCHARBINARY, and VARBINARY 索引只能用于字段的部分:col_name(length)

  4.只有InnoDB和MyISAM 支持在BLOB和TEXT上设置索引

  eg:

CREATE TABLE t2 (blob_col BLOB, INDEX(blob_col(10)));

  

NOT NULL | NULL

  1.如果不指定NOT NULL和NULL,默认是NULL

  2.在MySQL5.6中只有innodb,myisam,memory存储引擎,支持在列值有NULL的列上建索引。其它情况必须声 明所建索引列not null。

DEFAULT

  1.设置列的默认值,必须使常量。不能设置为函数:NOW(),CURRENT_DATE()

  2.当列为:DATETIME或TIMESTAMP时,可以设置default为:CURRENT_TIMESTAMP

  3.如果没有default值,会根据列的类型,默认指定default值。/*其它文章会梳理着部分内容*/

  4.BLOB和TEXT类型,不会指定默认值。

  5.注意strict mode开启时的限制,例如:NO_ZERO_IN_DATE

  例句:

CREATE TABLE `t2` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `num` int(11) NOT NULL DEFAULT ‘0‘,
   `logintime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

  

AUTO_INCREMENT

  1.自增列,一表只能有一个,必须使用索引,不能有默认值。自增步长和起始可以通过参数设置,也可通过建表语句指定。

  事例:

CREATE TABLE t2(
id INT NOT NULL AUTO_INCREMENT,
num INT NOT NULL DEFAULT 0,
logintime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
)ENGINE=INNODB AUTO_INCREMENT=100;

  

  插入数据:

mysql> insert into t2(num) values(1);
Query OK, 1 row affected (0.12 sec)

mysql> insert into t2(num) values(2);
Query OK, 1 row affected (0.01 sec)

  

mysql> select * from t2;
+-----+-----+---------------------+
| id | num | logintime |
+-----+-----+---------------------+
| 100 | 1 | 2016-11-16 14:45:20 |
| 101 | 2 | 2016-11-16 14:45:25 |
+-----+-----+---------------------+
2 rows in set (0.00 sec)

  

  通过两个参数分别设置:递增量和起始数值

mysql> show variables like ‘%auto_inc%‘;
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+

  

COMMENT

字段描述:可以通过show create table;show full columns;查看显示:

事例:

CREATE TABLE t4(
id INT NOT NULL AUTO_INCREMENT COMMENT ‘序列号‘,
num INT NOT NULL DEFAULT 0 COMMENT ‘电话号码‘,
logintime TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT ‘登录时间‘,
PRIMARY KEY (`id`)
)ENGINE=INNODB AUTO_INCREMENT=100 ;

  

查看:

mysql> show full columns from t4;
+-----------+-----------+-----------+------+-----+-------------------+----------------+---------------------------------+--------------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-----------+-----------+-----------+------+-----+-------------------+----------------+---------------------------------+--------------+
| id | int(11) | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | 序列号 |
| num | int(11) | NULL | NO | | 0 | | select,insert,update,references | 电话号码 |
| logintime | timestamp | NULL | NO | | CURRENT_TIMESTAMP | | select,insert,update,references | 登录时间 |
+-----------+-----------+-----------+------+-----+-------------------+----------------+---------------------------------+--------------+
3 rows in set (0.00 sec)

COLUMN_FORMAT

  1. 一般用于NDB表的个别列。
  2. FIXED:指定固定的列宽度
  3. DYNAMIC:指定可变列宽度
  4. DEFAULT:两者都可用,根据列类型自动选择。
  5. 对于NDB表,COLUMN_FORMAT是:DEFAULT.对于非NDB引擎表是没有效果的,MySQL5.6之后,默认不开启。STORAGE

  事例:

  只适用于:NDB引擎

CREATE TABLE t5 (
c1 INT STORAGE DISK,
c2 INT STORAGE MEMORY
) ENGINE NDB;

CREATE TABLE t1 (
c1 INT STORAGE DISK,
c2 INT STORAGE MEMORY
) TABLESPACE ts_1 ENGINE NDB;

  

CREATE TABLE ... LIKE

格式:

CREATE TABLE new_tbl LIKE orig_tbl;

  

基于另一个表创建空表,包括表的列和索引的定义。

事例:

create table t4 like t2;

  

t2表的定义:

mysql> desc t2;
+-----------+-----------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| num | int(11) | NO | | 0 | |
| logintime | timestamp | NO | | CURRENT_TIMESTAMP | |
+-----------+-----------+------+-----+-------------------+----------------+

  

t4表的定义:

mysql> desc t4;
+-----------+-----------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| num | int(11) | NO | | 0 | |
| logintime | timestamp | NO | | CURRENT_TIMESTAMP | |
+-----------+-----------+------+-----+-------------------+----------------+

  

注意:

  1.从MySQL5.6.1开始,当另一个表处于:LOCK TABLE状态时,不能create table. . . like

  2.当创建新表时的sql_mode和创建原表的sql_mode不同时,表的定义对于新的sql_mode是无效的,导致创建语句失败。

CREATE TABLE ... SELECT

格式:

CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;

  

  1.只会复制表结构,不复制索引;可以复制指定列。

  2.创建表的列和 select后面的列,要保持一致。

事例:

原表s1:

mysql> desc s1;
+---------+-------------+------+-----+-------------------+-------+
| Field   | Type        | Null | Key | Default           | Extra |
+---------+-------------+------+-----+-------------------+-------+
| id      | int(11)     | NO   | PRI | NULL              |       |
| name    | varchar(20) | YES  |     | NULL              |       |
| LogTime | timestamp   | YES  |     | CURRENT_TIMESTAMP |       |
+---------+-------------+------+-----+-------------------+-------+

  

mysql> select * from s1;
+----+------+---------------------+
| id | name | LogTime             |
+----+------+---------------------+
|  1 | kata | 2016-11-16 16:01:48 |
+----+------+---------------------+

  

创建新表s2、s3

create table s2 as select * from s1;
mysql> desc s2;
+---------+-------------+------+-----+-------------------+-------+
| Field   | Type        | Null | Key | Default           | Extra |
+---------+-------------+------+-----+-------------------+-------+
| id      | int(11)     | NO   |     | NULL              |       |
| name    | varchar(20) | YES  |     | NULL              |       |
| LogTime | timestamp   | YES  |     | CURRENT_TIMESTAMP |       |
+---------+-------------+------+-----+-------------------+-------+

  

mysql> select * FROM s2;
+----+------+---------------------+
| id | name | LogTime             |
+----+------+---------------------+
|  1 | kata | 2016-11-16 16:01:48 |
+----+------+---------------------+

  

创建表s3

create table s3 as select id,name from s2;

  

mysql> desc s3;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

  

mysql> select * from s3;
+----+------+
| id | name |
+----+------+
|  1 | kata |
+----+------+

  

创建表时指定新的列名:前后列一致

create table s4(Sid int,Sname varchar(10)) as select id as ‘Sid‘,name as ‘Sname‘ from s1;

  

mysql> desc s4;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| Sid   | int(11)     | YES  |     | NULL    |       |
| Sname | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

  

创建表时指定的列名:前后不一致时:结果异常

mysql> create table s7(Sid int,Sname varchar(10)) as select id,name from s1;

异常结果:

mysql> desc s7;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| Sid   | int(11)     | YES  |     | NULL    |       |
| Sname | varchar(10) | YES  |     | NULL    |       |
| id    | int(11)     | NO   |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

  

表的物理文件

1.表文件的存储由配置参数:innodb_file_per_table决定

  MySQL版本:<= 5.6.5 默认OFF

  MySQL版本:>= 5.6.6 默认ON

  参数配置开启ON:innodb会将表的data和indexs存储在单独的文件里:.ibd

  参数配置关闭OFF: innodb会将表的data和indexs存储在:系统表空间文件:一个或多个 ibdata* files.

2.MYISAM表的数据文件结构

File Purpose
tbl_name.frm Table format (definition) file
tbl_name.MYD Data file
tbl_name.MYI Index file

备注:关于临时表 字段类型和表索引 部分单独梳理!!!

时间: 2024-10-18 13:15:32

【SQL篇章--CREATE TABLE】的相关文章

Access建表SQL语句Create Table设置自动增长列的关键字AUTOINCREMENT使用方法

SQL AUTO INCREMENT 字段 uto-increment 会在新记录插入表中时生成一个唯一的数字. AUTO INCREMENT 字段 我们通常希望在每次插入新记录时,自动地创建主键字段的值. 我们可以在表中创建一个 auto-increment 字段. 用于 MySQL 的语法 下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键: CREATE TABLE Persons ( P_Id int

SQL Server: create table sql script

---摇奖observeh数据库设计 Function getSpace lottery /* -- Author:geovindu 涂聚文 -- Date: 20180427 为了自写生成代码.根据Metedata 生成有注释和关系表的代码,表必须要主键和注释 CREATE DATABASE LotteryDrawing GO USE LotteryDrawing GO */ ---獎項項目表AwardProject IF EXISTS (select * from sysobjects wh

linux之SQL语句简明教程---CREATE TABLE

表格是数据库中储存资料的基本架构.在绝大部份的情况下,数据库厂商不可能知道您需要如何储存您的资料,所以通常您会需要自己在数据库中建立表格.虽然许多数据库工具可以让您在不需用到 SQL 的情况下建立表格,不过由于表格是一个最基本的架构,我们决定包括 CREATE TABLE的语法在这个网站中. 在我们跳入 CREATE TABLE 的语法之前,我们最好先对表格这个东西有些多一点的了解.表格被分为栏位 (column) 及列位 (row).每一列代表一笔资料,而每一栏代表一笔资料的一部份.举例来说,

【SQL篇章】【SQL语句梳理 :--基于MySQL5.6】【已梳理:ALTER TABLE解析】

ALTER TABLE 解析实例: SQL: 1.增加列 2.增加列,调整列顺序 3.增加索引 4.增加约束 5.增加全文索引FULL-TEXT 6.改变列的默认值 7.改变列名字(类型,顺序) 8.不改变列名字 9.删除列 10.删除主键 11.删除索引 12.删除约束 13.改表名 14.改变字符集 创建一张表 CREATE TABLE t1 (a INTEGER,b CHAR(10)); 1. 增加列 格式: ADD [COLUMN] (col_name column_definition

SQL CREATE TABLE 语句\SQL 约束 (Constraints)\SQL NOT NULL 约束\SQL UNIQUE 约束

CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... ) 数据类型(data_type)规定了列可容纳何种数据类型.下面的表格包含了SQL中最常用的数据类型: 数据类型 描述 integer(size) int(size) smallint(size) tinyint(size) 仅容纳整数.在括号内规定数字的最

php大力力 [023节]CREATE TABLE创建新表sql写字段备注(2015-08-27)

2015-08-27 php大力力023.CREATE TABLE创建新表sql写字段备注 http://www.cnblogs.com/dalitongxue/p/4762182.html 参考: MySQL字段的说明和备注信息 http://blog.csdn.net/chelen_jak/article/details/45689139 DROP TABLE IF EXISTS test_table; CREATE TABLE test_table( Test_ID int NOT NUL

sql: Oracle 11g create table, function,trigger, sequence

--书藉位置Place目录 drop table BookPlaceList; create table BookPlaceList ( BookPlaceID INT PRIMARY KEY, --NUMBER BookPlaceName nvarchar2(500) not null, BookPlaceCode varchar(100) null, --位置編碼 BookPlaceParent INT null --BookPlaceKindId nvarchar(500) null --

SQL高级应用(CREATE DATABASE、CREATE TABLE)

SQL CREATE DATABASE CREATE DATABASE 用于创建数据库,语法如下 CREATE DATABASE database_name 例子:创建一个名为 db_test的数据库 CREATE DATABASE db_test 可以通过 CREATE TABLE 来添加数据库表. SQL CREATE TABLE CREATE TABLE 语句用于创建数据库中的表,语法如下 CREATE TABLE table_name ( 列名称1 数据类型, 列名称2 数据类型, 列名

[24]SQL CREATE TABLE 语句

[24]SQL CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. 表由行和列组成,每个表都必须有个表名. SQL CREATE TABLE 语法 CREATE TABLE table_name ( column_name1 data_type(size), column_name2 data_type(size), column_name3 data_type(size), .... ); column_name 参数规定表中列的名称. data_type 参