經常使用數據類型mysql
1.mysql中的基本數據類型
sql
整型、浮點型、字符類型、日期類型、枚舉和集合。數據庫
2.經常使用的約束條件安全
PRIMARY KEY、UNIPUE KEY、NOT NULL、FOREIGN KEY。
session
基本建表的語法spa
1.基本建表的語法:create table 表名(3d
字段名1 類型[(寬度) 約束條件],
code
字段名2 類型[(寬度) 約束條件],server
字段名3 類型[(寬度) 約束條件]blog
);
2.在建表的時候都須要注意的點:
1.在同一張表中,字段名不能夠重複;
2.在建立表中,字段寬度和約束條件是可選的,字段名和類型是必定要有的;
3.在建立表的最後一個字段名後不能加逗號
3.補充
1)寬度指的是對存儲數據的限制
在MySQL5.5以上的版本中,有一個安全模式,在低版本的MySQL中是能夠將數據插入進去的,全部不用感到有疑問。
2)約束條件not null
4.總結:類型與約束條件的區別
類型:用來限制字段必須用怎樣的類型來存儲
約束條件:是在字段類型之外的額外限制
嚴格安全模式
咱們剛剛在上面設置了char,tinyint,存儲數據時超過它們的最大存儲長度,發現數據也能正常存儲進去,只是mysql幫咱們自動截取了最大長度。但在實際狀況下,咱們應該儘可能減小數據庫的操做,緩解數據庫的壓力,讓它僅僅只管理數據便可,這樣的狀況下就須要設置安全模式
1)使用指令 show variables like '%mode%';
2.set session # 只在當前操做界面有效
set global # 全局有效
3.set global sql_mode ='STRICT_TRANS_TABLES'
4.修改完成後重啓客戶端便可
數據類型的深層理解
1.整型
分類:TINYINT SMALLINT MEDIUNINT INT BIGINT
做用:存儲年齡、等級、id、各類號碼等
驗證整型的有效範圍:
create table t1(x tinyint); insert into t1 values(128),(-129); create table t2(x tinyint unsigned); insert into t2 values(-1),(256); create table t3(x int unsigned); insert into t3 values(4294967296);
2.浮點型
分類:float、double、decimal
做用:身高、體重、薪資
# 存儲限制 float(255,30) double(255,30) decimal(255,30) # 精確度驗證 create table t9(x float(255,30)); create table t10(x double(255,30)); create table t11(x decimal(65,30)); insert into t9 values(1.111111111111111111111111111111); insert into t10 values(1.111111111111111111111111111111); insert into t11 values(1.111111111111111111111111111111);
3.字符型
分類:char(定長)、varchar(變長)
做用:姓名、描述類信息
create table t10(name char(4)) # 超出四個字符報錯,不夠四個字符空格補全 create table t11(name varchar(4)) # 超出四個字符報錯,不夠四個有幾個就存幾個 # 驗證存儲限制 insert into t12 values('hello'); insert into t13 values('hello'); # 驗證存儲長度 insert into t12 values('a'); #'a ' insert into t13 values('a'); #'a' select * from t12 select * from t13 # 沒法查看真正的結果 select char_length(name) from t12 select char_length(name) from t13 # 仍然沒法查看到真正的結果 """首先應該確定的是在硬盤上存的絕對是真正的數據,但顯示的時候mysql會自動將末尾的空格取掉""" # 若是不想讓mysql幫你作自動去除末尾空格的操做,須要再添加一個模式 set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH"; # 退出客戶端從新登錄 select char_length(x) from t12; #4 select char_length(y) from t13; #1 # 針對char類型,mysql在存儲時會將數據用空格補全存放到硬盤中。可是會在讀出結果的時候自動取掉末尾的空格 """ char與varchar的使用區別 """ name char(5) # 缺點:浪費空間 # 優勢:存取速度都快 egon alex lxx jxx txx name varchar(5) # 缺點:存取速度慢 # 優勢:節省空間 1bytes+egon 1bytes+alex 1bytes+lxx 1bytes+jxx 1bytes+txx
4.時間類型
分類:date、time、datetime、year
5.枚舉和集合
約束條件
約束條件的分類:
""" PRIMARY KEY (PK) 標識該字段爲該表的主鍵,能夠惟一的標識記錄 FOREIGN KEY (FK) 標識該字段爲該表的外鍵 NOT NULL 標識該字段不能爲空 UNIQUE KEY (UK) 標識該字段的值是惟一的 AUTO_INCREMENT 標識該字段的值自動增加(整數類型,並且爲主鍵) DEFAULT 爲該字段設置默認值 UNSIGNED 無符號 ZEROFILL 使用0填充 """
1.not null+default
create table user( id int, name char(16) ); insert into user values(1,null) # 能夠修改 alter table user modify name char(16) not null; insert into user(name,id) values(null,2); # 報錯 插入數據能夠在表名後面指定插入數據對應的字段 create table student( id int, name char(16) not null, gender enum('male','female','others') default 'male' ) insert into student(id,name) values(1,'jason') # 成功
2.unique
# 單列惟一 create table user1( id int unique, name char(16) ); insert into user1 values(1,'jason'),(1,'egon') # 報錯 insert into user1 values(1,'jason'),(2,'egon') # 成功 # 聯合惟一 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);
3.primary key+auto_increment
# 單從約束角度來講primary key就等價於not null unique create table t11(id int primary key); desc t11; insert into t11 values(1),(1); # 報錯 insert into t11 values(1),(2); # 除了約束以外,它仍是innodb引擎組織數據的依據,提高查詢效率 """ 強調: 1.一張表中必須有且只有一個主鍵,若是你沒有設置主鍵,那麼會從上到下搜索直到遇到一個非空且惟一的字段自動將其設置爲主鍵 """ create table t12( id int, name char(16), age int not null unique, addr char(16) not null unique )engine=innodb; desc t12; """ 2.若是表裏面沒有指定任何的能夠設置爲主鍵的字段,那麼innodb會採用本身默認的一個隱藏字段做爲主鍵,隱藏意味着你在查詢的時候沒法根據這個主鍵字段加速查詢了 索引:相似於書的目錄,沒有主鍵就至關於一頁一頁翻着查 3.一張表中一般都應該有一個id字段,而且一般將改id字段做成主鍵 """ # 聯合主鍵:多個字段聯合起來做爲表的一個主鍵,本質仍是一個主鍵 create table t18( ip char(16), port int, primary key(ip,port) ); desc t18; # 主鍵id做爲數據的編號,每次最好能自動遞增 create table t13( id int primary key auto_increment, name char(16) ); insert into t13('jason'),('jason'),('jason'); # id字段自動從1開始遞增 # 注意:auto_increment一般都是加在主鍵上,而且只能給設置爲key的字段加
4.補充
delete from tb1; 強調:上面的這條命令確實能夠將表裏的全部記錄都刪掉,但不會將id重置爲0, 因此收該條命令根本不是用來清空表的,delete是用來刪除表中某一些符合條件的記錄 delete from tb1 where id > 10; 若是要清空表,使用truncate tb1; 做用:將整張表重置,id從新從0開始記錄