【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
 
 
 
 
 
 
備注:關於臨時表 字段類型和表索引 部分單獨梳理!!!
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM