資料型別
1. 數值型別
整數型別:tinyint smallint mediumint int bigint
作用:儲存年齡,id,等級,各種號碼等。
強調:整型的寬度指的是顯示寬度,並不是儲存寬度,且沒必要指定寬度。
ps:create table t3(id int unsigned); 建立int型別預設有正負數,如果要去掉符號,在int 後加 unsigned限制。
浮點型別:float double
作用:儲存薪資、身高、體重、體質引數等
定點數型別:dec等同於decimal
浮點型別:
float:#float[(m,d)] [unsigned] [zerofill]
定義:單精度浮點數(非準確小數值),m是數字總個數,d是小數點後個數。m最大值為255,d最大值為30
精確度: 隨著小數的增多,精度變得不準確
ps:create table t1(weight float(255,30) unsigned);
double:#double[(m,d)] [unsigned] [zerofill]
定義:雙精度浮點數(非準確小數值),m是數字總個數,d是小數點後個數。m最大值為255,d最大值為30
精確度:隨著小數的增多,精度比float要高,但也會變得不準確
decimal:decimal[(m[,d])] [unsigned] [zerofill]
定義:準確的小數值,m是數字總個數(負號不算),d是小數點後個數。
m最大值為65,d最大值為30, 但整數為35位。
精確度:隨著小數的增多,精度始終準確
對於精確數值計算時需要用此型別
decimal能夠儲存精確值的原因在於其內部按照字串儲存。
2.日期型別
date:2017-11-12 出生年月日 : yyyy-mm-dd(1000-01-01/9999-12-31)
time:10:10:56 上課時間 :hh:mm:ss('-838:59:59'/'838:59:59')
datetime:2017-11-12 10:10:56 註冊時間,發布時間 : yyyy-mm-dd hh:mm:ss(1000-01-01 00:00:00/9999-12-31 23:59:59 y)
year:2017 大事件時間
在實際應用的很多場景中,mysql的這兩種日期型別(datetime,timestamp)都能夠滿足我們的需要,儲存精度都為秒,但在某些情況下,
會展現出他們各自的優劣。下面就來總結一下兩種日期型別的區別。
1.datetime的日期範圍是1001——2023年,timestamp的時間範圍是1970——2023年。
2.datetime儲存時間與時區無關,timestamp儲存時間與時區有關,顯示的值也依賴於時區。在mysql伺服器,
作業系統以及客戶端連線都有時區的設定。
3.datetime使用8位元組的儲存空間,timestamp的儲存空間為4位元組。因此,timestamp比datetime的空間利用率更高。
4.datetime的預設值為null;timestamp的字段預設不為空(not null),預設值為當前時間(current_timestamp),
如果不做特殊處理,並且update語句中沒有指定該列的更新值,則預設更新為當前時間。
3.字元型別:char 與 varchar
#char型別:定長,簡單粗暴,浪費空間,訪問速度快
#varchar型別:變長,精準,節省空間,訪問速度慢
4.列舉與集合型別:列舉型別(enum)和 集合型別(set)
作用:欄位的值只能在給定範圍中選擇,如單選框,多選框
- enum 單選 只能在給定的範圍內選乙個值,如性別 *** 男male/女female
ps: create table t1(id int, name char(10), *** enum('male', 'female', 'none'));
alter table t1 modify *** enum('male', 'female', 'none') not null default 'male';
insert into t1(id,name) values(1,'egon');
- set 多選框
ps: create table t1(id int,name char(10), hobby set('music', 'read','basketball','football'));
insert into t1(id, hobby) values(1, 'zhangliang','music,read, basketball');
約束
key:
唯一:unique
主鍵:primary key
ps:create table t2(id int primary key auto_increment, name char(10));
create table t2(id int not null unique auto_increment, name char(10));
create table t2(id int, name char(10), constraint pri_id primary key(id));
其中第三種寫法在後面加關鍵字緊跟名字然後是約束條件, 第四種也可以直接省略關鍵字。
create table t2(id int, name char(10), primary key(id));
not null unique 可以有多個,而primary key 只能有乙個,在沒有primary key的時候,not null unique的第乙個
會設定成為主鍵,其他的為不為空且唯一。
聯合唯一:限制資料重複,例如電腦的ip和埠繫結到一起後代表乙個服務,不能重複,單個ip跟埠可以重複。
ps1:電腦服務ip和port(不合理)
create table t3(id int, ip char(15), port int, primary key(ip,port));
insert into t3(id, ip, port) values(1,'1.1.1.1',3306);
insert into t3(id, ip, port) values(1,'1.1.1.2',3306);
ps2:
create table t6(id int primary key auto_increment,
ip char(15) not null,
port int not null,
unique(ip,port));
insert into t6(ip,port) values('1.1.1.1',3306);
insert into t6(ip,port) values('1.1.1.2',3306);
表關聯關係:多對多、多對
一、一對一
foreign key:表關聯
多對一:
先建立被關聯的表。
...在建立需要關聯其他的表.
create table emp(
id int primary key auto_increment,
name char(10) not null,
*** enum('male','female') not null default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
on delete cascade
on update cascade
);外來鍵插入內容的時候,內容必須來自於被關聯表的內容
on delete cascade,on update cascade :加入這兩個欄位後被關聯的表修改(同步更新,同步刪除)。
多對多:(先建兩張表,然後在建乙個表來將兩張表關聯起來)
能夠相互關聯且能夠相互多對一。
create table user2role(
id int primary key auto_increment,
user_id int,
role_id int,
foreign key(user_id) references user(id)
on update cascade
on delete cascade,
foreign key(role_id) references role(id)
on update cascade
on delete cascade
);一對一:
foreign key 的字段唯一加 unique
mysql中的資料型別以及常見約束
mysql中的資料型別以及常見約束 一 常見約束 1.介紹 一種限制,用來限制表中的資料,為了保證表中的資料的準確性和可靠性 2.約束的分類 一共有六大約束 not null 非空約束,用來保證該字段的值不能為空 defaul 預設約束,用來保證該字段有預設值t primary key 主鍵約束,用...
MySQL資料型別和約束
常用資料型別如下 資料型別說明 資料型別附錄表 整數型別 型別位元組大小 有符號範圍 signed 無符號範圍 unsigned tinyint 128 127 0 255 smallint 32768 32767 0 65535 mediumint 8388608 8388607 0 167772...
MySQL 資料型別和約束
資料庫中的資料儲存在資料表中,在表中為了更加準確的儲存資料,保證資料的正確有效,可以在建立表的時候,為表新增一些強制性的驗證,比如 資料型別和約束。資料型別是指在建立表的時候為表中字段指定資料型別,只有資料符合型別要求才能儲存起來,使用資料型別的原則是 夠用就行,盡量使用取值範圍小的,而不用大的,這...