MySQL中的數據類型以及完整性約束


數據類型

  數據庫mysql中也是分很多數據類型的,最常用的就是數字類型、字符類型、日期類型、枚舉與集合類型

一、數字類型

  默認都是有符號的,即正負號,若想無符號,在創建表時加unsigned。指定寬度時,只影響顯示寬度不影響存儲,即只決定讀不決定寫。

注:其實我們完全沒必要為整數類型指定顯示寬度,使用默認的就可以了

  最常用的是int,常用的一般是tinyint和int

  tinyint:1個字節,有符號時可存(-128~127),無符號時可存(0~255),超過范圍的數存成最大范圍的那個數

  smallint:2個字節,有符號時可存(-2^15~2^15 -1),無符號時可存(0~2^16 -1)

  mediumint:3個字節,有符號時可存(-2^23~2^23 -1),無符號時可存(0~2^24 -1)

  int:4個字節,有符號是可存(-2^31~2^31 -1),無符號是可存(0~2^32 -1)

  bigint:8個字節,有符號時可存(-2^63~2^63 -1),無符號時可存(0~2^64 -1)

  另外還有浮點型:float、double和decimal

  float和double不精准,超過精准范圍的小數會被削為0,但在日常情況下已足夠使用。decimal是精准浮點數,但比較消耗內存,所以在一般情況下建議使用float。格式為float(x,y),其中的x代表數字總個數不算符號,y代表保留的小數點位數

  bit類型:用來存放二進制數,范圍為1~64,不指定則默認1位

create table t1(id bit);#bit后可加括號指定范圍,不指定默認為1
insert into t1 values(8);#在表中添加一個8
select bin(id),hex(id),oct(id) from t1;#查看時需要轉換一下進制,需要什么進制呈現就用相應的函數

 

二、字符類型:寬度約束的是字符的個數

  char:定長,不夠寬度時用空格補齊。字符長度范圍:0~255

    特點:存取效率快,但浪費空間。存儲時會在右側填充空格以滿足指定長度,但在查詢時有自動刪除空格。

  varchar:變長,在指定寬度內存什么就是什么。字符長度范圍:0~65535

    特點:精准,節省空間但存儲效率較慢。

注:雖然varchar更精准,但一般都是用char多一點,畢竟在精准度要求並沒有特別高的情況下效率比較重要

#查看字符的長度
select x,char_length(x) from t1;

#查看字節的長度(utf-8中一個中文字符占三個字節)
select x,length(x) from t1;

#以上方式查看時,char會自動刪除空格,需在查詢前指定
set sql_mode='pad_char_to_full_length';
#才可以將char類型的數據完整的查看


#舉例:
create table t1(name1 char(10),name2 varchar(5));
insert into t1 values('ladygaga','egon');
select name1,char_length(name1),nam2,char_length(name2) from t1;
select name1,length(name1),nam2,length(name2) from t1;
#查詢結果為8,4
#指定set sql_mode='pad_char_to_full_length';后查詢結果為10,4

 

三、時間類型:根據不同的需求選擇不同的時間類型

  datetime:yyyy-mm-dd hh:mm:ss  范圍為1000-01-01 00:00:00~9999-12-31 23:59:59

  year:yyyy  范圍為1901~2155,無論指定何種寬度,最后都是4

  date:yyyy-mm-dd  范圍為1000-01-01~9999-12-31

  time:hh:mm:ss  

  單獨插入時間時需要以字符的形式,按照對應格式。插入年份時盡量使用4位值,如果用兩位的話需要知道:當輸入的2位<=69時,顯示為20xx;當輸入的的2位>=70時,顯示為19xx。

舉例:

create table t2(id int,born_date date,born_year year,reg_time datetime,class_time time);
insert into t2 values(1,'alex',now(),now(),now(),now());#now()函數自動插入當前時間
insert into t2 values(2,'egon','2017-09-11','2017','2017-09-11 17:17:17','17:17:17');#標准形式
insert into t2 values(3,'eva','20170911','2017','20170911171717','171717');#這種形式也支持

 

 四、枚舉與集合: 字段只能在給定的范圍內選擇。枚舉enum為單選,集合set為多選,可設定默認值         

 舉例說明

create table t3 (id int primary key auto_increment,#自增id
name=char(5),
sex enum('male','female'),#枚舉,二選一
hobbies set('eat','sleep','run','sing')#集合,多選
);
insert into t3 (name,sex,hobbies) values('egon','male','eat,sleep');

 

 


 

 

完整性約束

  not null 和null:不為空和可為空,創建時指定,不指定時默認為可空

  default:設置默認值的關鍵字,用來設置不傳值時的默認值。若字段設置了默認值,插入空時填入的就是默認值

  unique:標識該字段是唯一的

#方法一:
create table t4(name char(10) unique);

#方法二:
create table t5(name char(10),constraint uk_name unique(name));

#聯合唯一:表示多個字段聯合唯一,只要有一個字段不同即可插入,只有在所有字段都相同是才不可插入
create t6(id int,name char(10),host char(20) not null,port int not null,unique(host,port));
#將host和port聯合唯一,若host和port都一樣則不准插入
insert into t6(1,'mao',192.168.0.0',8080);
insert into t6(2,'gou',192.168.0.1',8080);
insert into t6(3,'zhu',192.168.0.1',8081);#都可插入
insert into t6(4,'ji',192.168.0.1',8081);#不可插入

 

primary key:主鍵,不為空且唯一 

#方法一:
create table t7(id int not null unique);#遵循不為空且唯一,但不是主鍵的正確表達式
#方法二:
create table t7(id int primary key);
#方法三:
create table t7(id int,constraint pk_name primary key(id));

 

auto_increment:自增,被約束字段必須同時被key約束。對於自增的字段,delete刪除后再插入值,該字段扔按照刪除前的位置繼續增長

  auto_increment_offset:偏移量,默認值為1

  auto_increment_increment:步長,默認值為1

  全局范圍內設置步長set global auto_increment_increment=2;

  當前會話范圍內設置步長set session auto_increment_increment=2;

  同時設置偏移量和步長的情況下,若偏移量的值>步長的值,則偏移量的值就會被忽略,即失效,即偏移量=1

 

foreign key:外鍵,用於表的關聯(重點!查詢語句中最難點)

  當有多張表,表1的多條記錄可以對應到表2的一條記錄時,就可以將其關聯起來。此時必須保證表2的該記錄是唯一的。

  可以一對一關聯,也可以多對一關聯,多對多關聯

 

 

 

舉例:將下面的表進行相應的關聯

要求:學生表關聯班級表,課程表關聯老師表,成績表關聯所有表

注:先建立父表,即要被關聯的表,再建立子表並建立外鍵關聯父表,同步更新on update cascade,同步刪除on delete cascade。插入記錄時先操作父表,再操作字表。

 

 

 

 


免責聲明!

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



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