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

數據類型

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

1、數字類型sql

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

注:其實咱們徹底不必爲整數類型指定顯示寬度,使用默認的就能夠了session

  最經常使用的是int,經常使用的通常是tinyint和int函數

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

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

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

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

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

  另外還有浮點型: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;#查看時須要轉換一下進制,須要什麼進制呈現就用相應的函數

 

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

  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

 

3、時間類型:根據不一樣的需求選擇不一樣的時間類型

  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');#這種形式也支持

 

 4、枚舉與集合: 字段只能在給定的範圍內選擇。枚舉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。插入記錄時先操做父表,再操做字表。

 

相關文章
相關標籤/搜索