一、字段類型
創建表的完整語法:
create table 表名(
字段名 字段類型[(寬度) 約束條件],
…………
字段名 字段類型[(寬度) 約束條件]
)
# 栗子
create database testnow;
use testnow;
create table info(name char);
insert into info values('moon');
**P.S.**:在非嚴格模式下,栗子中的能夠插入成功,但是隻能顯示一位,在嚴格模式下則會報錯。
字段類型:約束該字段存儲的數據類型
寬度:對數據存儲的限制
約束條件:基於字段類型附加的額外限制條件,如不能爲空 not null,不能重複
注意點:
- 同一張表內,字段名不能重複
- 字段名和字段類型是必須的,寬度和約束條件是可選的
- 最後一個字段後不能加逗號!
(一)、整型
分類
TINYINT(1),SMALLINT(2),MEDIUMINT(3),INT(4),BIGINT(8)
特殊的寬度
默認有正負號,唯獨整型字段在設置寬度的時候,限制不是存儲寬度而是顯示寬度,在創建整型字段的時候,不需要指定字段寬度(整型的顯示寬度),如果存入的數字不夠整型的最大限制位數默認用空格填充
(二)、浮點型
分類
float,double,decimal
float(m,n) # 總長度爲m位,其中小數佔n位
精度:
由低到高float,double,decimal
(三)、字符類型
char:定長 不超過寬度前提下不夠用空格填充
varchar:變長 不超過寬度前提下按實際長度存儲 自動加上報頭來標識數據長度
(四)、日期類型
-
date 年月日
-
time 時分秒
-
datetime 年月日時分秒
-
year 年
栗子 create table time( id int, birth date, class_time time, reg_time datetime, yy year ); insert into time values(1,"1994-03-30","18:18:18","2018-08-18 18:18:18","2018");
(五)、枚舉和集合
枚舉(enum):多選一
栗子
create table info(
id int,
name char(16),
gender enum('male','female','other'
);
gender插入的值只能是'male','female','other'三者之一
集合(set):多選多,也可以只選一個
栗子
create table set(
id int,
name char(6),
gender enum('male','female','others'),
hobby set('read','code','game','run')
);
insert into t17 values(1,'tank','male',"read,game,run");
二、約束條件
PRIMARY KEY (PK)
標識該字段爲該表的主鍵,可以唯一的標識記錄,一般配合AUTO_INCREMENT實現自增
單從約束角度來說primary key就等價於not null + unique,除了約束之外,它還是innodb引擎組織數據的依據,提升查詢效率;
注意:
- 一張表中必須有且只有一個主鍵,如果你沒有設置主鍵,那麼會從上到下搜索直到遇到一個非空且唯一的字段自動將其設置爲主鍵
- 如果表裏面沒有指定任何的可以設置爲主鍵的字段,那麼innodb會採用自己默認的一個隱藏字段作爲主鍵,隱藏意味着你在查詢的時候無法根據這個主鍵字段加速查詢,索引就類似於書的目錄,沒有主鍵就相當於一頁一頁翻着查
- 一張表中通常都應該有一個id字段,並且通常將改id字段作成主鍵
- 聯合主鍵:多個列聯合作爲主鍵
FOREIGN KEY (FK)
標識該字段爲該表的外鍵
NOT NULL
標識該字段不能爲空
UNIQUE KEY (UK)
標識該字段的值是唯一的
單列唯一:該列只能有唯一的一行,例如ID
# 栗子
create table user(
id int unique,
name char(16)
);
insert into user values(1,'moon'),(1,'zier') # 報錯
insert into user values(1,'moon'),(2,'zier') # 成功
聯合唯一:兩列聯合起來是唯一的,IP和PORT
# 栗子
create table server(
id int,
ip char(16),
port int,
unique(ip,port)
);
insert into server values(1,'127.0.0.1',8080);
insert into server values(2,'127.0.0.1',8080); # 報錯
insert into server values(1,'127.0.0.1',8081);
AUTO_INCREMENT
標識該字段的值自動增長(整數類型,而且爲主鍵),結合主鍵使用
DEFAULT
該字段設置默認值
UNSIGNED
無符號
ZEROFILL
使用0填充
三、拾遺
show variables like "%mode%"; # 查看數據庫配置中變量名包含mode的配置參數
修改安全模式:必須將你想要所有模式都寫入,不是添加模式而是更新模式
set session # 只在當前操作界面有效
set global # 全局有效
set global sql_mode ='STRICT_TRANS_TABLES'; # 嚴格模式
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH"; # 不自動清除末尾空格
delete from 表名; # 刪除所有信息,但不會重置id(主鍵)
truncate 表名; # 重置整張表,包括id