1. 程式人生 > >Mysql-資料型別及表約束

Mysql-資料型別及表約束

表的資料型別

tinyint

有符號:-128~127, 無符號:0~255, 預設有符號

create table t1(num tinyint);
insert into t1 values(1);
insert into t1 values(128); --越界報錯

無符號:

create table t2(num tinyint unsigned);
insert into t2 values(-1); --報錯
insert into t2 values(255);

float

float[(m, d)] [unsigned] : M指定顯示長度,d指定小數位數,佔用空間4個位元組

float(4, 2)表示的範圍有符號數是-99.99~99.99,無符號數是0~99.99mysql在儲存數值時會自動進行四捨五入

create table t3(id int, salary float(4, 2));
insert into t3 values(1, -99.99);
insert into t3 values(2, -99.991); --四舍
insert into t3 values(3, 99.986); --五入

 decimal

decimal(m, d) [unsigned] : 定點數m指定長度,d表示小數點的位數

decimal(5, 2)表示的範圍是-999.99~999.99,這樣來看decimal和float很像,但是兩者表示的精度不一樣

create table t4(id int, num1 float(10, 8), num2 decimal(10, 8));
insert into t4 values(1, 21.21335432, 21.21335432);
select * from t4;

這樣看來,還是decima的精度更高一些,所以希望小數的精度更高,推薦使用decimal

char和varchar

char(L): 固定長度字串,L是可以儲存的長度,單位為字元,最大長度值可以為255
varchar(L): 可變長度字串,L表示字元長度,最大長度65535個位元組

varchar長度可以指定為0到65535之間的值,但是有1 - 3 個位元組用於記錄資料大小,所以說有效位元組數是 65532。

當我們的表的編碼是utf8時,varchar(n)的引數n最大值是65532/3=21844(因為utf中,一個字元佔用3個位元組),如果編碼是gbk,varchar(n)的引數n最大是65532/2=32766(因為gbk中,一個字元佔用2位元組).

所以資料長度如果都一樣,就使用定長(char),資料長度有變化,就使用變長(varchar).

日期和時間

datetime 時間日期格式 'yyyy-mm-dd HH:ii:ss' 表示範圍從1000到9999,佔用八位元組
date:日期 'yyyy-mm-dd',佔用三位元組
timestamp:時間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss格式和datetime完全一致,佔用四位元組

enum和set

enum,可以理解為單選型別,設定提供了多個選項的值,最終一個單元內只儲存了一個值

set,可以理解為多選型別,設定提供了多個選項值,最終一個單元格內可以儲存多個值

建立一個調查表votes,需要調查人的喜好, 比如(登山,游泳,籃球,武術)中去選擇(可以多選),(男,女)[單 選]:

create table votes(
    name varchar(30),
    hobby set('登山', '游泳', '籃球', '武術'),
    gender enum('男', '女')
);

插入資料:

insert into votes values('李四', '登山', '女');
insert into votes values('張三', '游泳,武術', '男');

表的約束

空屬性

雖然資料型別能夠約束欄位,但是資料型別比較單一,需要一些其他的約束,比如在學生表中,E-mail可以為空,但是姓名學號不能為空。我們可以建立一個班級表,表中必須要有班級和教室的名字,如果沒有這兩個就不知道在哪上課:

create table myclass(
    class_name varchar(20) not null,
    class_room varchar(20) not null
);

查看錶結構,不允許為空:

預設值

使用關鍵字default,某一個屬性經常性的出現某一個具體的值,可以在一開始指定好,在使用時,使用者可以選擇性的使用預設值

create table t6(
    name varchar(20) not null,
    age tinyint unsigned default 0,
    sex char(2) default '男'
);

插入資料,不指定欄位值,使用預設值

insert into t6 (name) values ('張三');
select * from t6;

列描述 

列描述在建立表時沒有實際意義,用來描述該欄位,跟據表建立語句儲存

create table t7 (
    name varchar(20) not null comment '姓名',
    age tinyint unsigned default 0 comment '年齡',
    sex char(2) default '男' comment '性別'
);

一般用desc語句檢視不到註釋資訊,使用下面語句檢視,\G是以列顯示:

show create table t7\G;

zerofill

格式化輸出,如果寬度小於設定的寬度(這裡設定的是 ),自動填充0。要注意的是,這只是最後顯示的結果。

主鍵

主鍵:primary key用來唯一的約束該欄位裡面的資料,不能重複,不能為空,一張表中最多隻能有一個主鍵;主鍵所在的列通常是整數型別。

建立表的時候直接在指定欄位上新增:

create table t8(
    id int unsigned primary key comment '學號不為空',
    name varchar(20) not null
);

在建立表的時候,在所有欄位之後,使用primary key(主鍵欄位列表)來建立主鍵,如果有多個欄位作為主 鍵,可以使用複合主鍵。

create table t9(
    id int unsigned,
    course char(10) comment '課程代號',
    score tinyint unsigned default 60 comment '成績',
    primary key(id, course) --組合主鍵
);

建立表之後追加主鍵

alter table 表名 add primary key(欄位列表)

刪除主鍵 

alter table 表名 drop primary key

自增長

auto_increment:當對應的欄位,不給值,會自動的被系統觸發,系統會從當前欄位中已經有的最大值+1操作, 得到一個新的不同的值。

通常和主鍵搭配使用,作為邏輯主鍵。

自增長的特點: 任何一個欄位要做自增長,前提是本身是一個索引(key一欄有值)

                       自增長欄位必須是整數

                       一張表最多隻能有一個自增長

create table t10(
    id int unsigned primary key auto_increment,
    name varchar(20) not null
);

插入資料,可以不指定id

insert into t10 (name) values ('張三');
insert into t10 (name) values ('李四');
select * from t10;

 唯一鍵

unique 一張表中有往往有很多欄位需要唯一性,資料不能重複,但是一張表中只能有一個主鍵:唯一鍵就可以解決表中有 多個欄位需要唯一性約束的問題。

唯一鍵的本質和主鍵差不多,唯一鍵允許為空,而且可以多個為空,空欄位不做唯一性比較。

create table t11(
    id char(10) unique comment '不能重複,可以為空',
    name varchar(20)
);

外來鍵

外來鍵用於定義主表和從表之間的關係:外來鍵約束主要定義在從表上,主表則必須是有主鍵約束或unique約束。當 定義外來鍵後,要求外來鍵列資料必須在主表的主鍵列存在或為null。

foreign key (欄位名) references 主表(列)

建立主鍵表

create table class(
    id int primary key,
    name varchar(20) not null comment '班級名'
);

建立從表

create table stu(
    id int primary key,
    name varchar(20) not null comment '學生名',
    class_id int,
    foreign key (class_id) references class(id)
);

綜合案例

有一個商店的資料,記錄客戶及購物情況,有以下三個表組成:

    1、商品goods(商品編號goods_ id,商品名goods_ name, 單價unitprice, 商品類別category, 供應商provider)

    2、客戶customer(客戶號customer_ id,姓名name,住址address,郵箱email,性別sex,身份證card_id)

    3、購買purchase(購買訂單號order_ id,客戶號customer_ id,商品號goods_ id,購買數量nums)

要求:

    每個表的主外來鍵

    客戶的姓名不能為空值

    郵箱不能重複

   客戶的性別(男,女)

--建立goods表
create table goods(
	goods_id int unsigned primary key auto_increment,
	goods_name varchar(100) not null default '',
	unitprice decimal(10, 2) not null default 0.0,
	category smallint not null default 0,
	provider varchar(100) not null default ''
);

--建立customer
create table customer(
	customer_id int unsigned primary key auto_increment,
	name varchar(50) not null default '',
	address varchar(100) not null default '',
	email varchar(60) not null unique,
	sex enum('男','女') not null default '男',
	card_id varchar(20) not null unique
);

--建立purchase
create table purchase (
	order_id varchar(30) not null primary key,
	customer_id int unsigned,
	goods_id int unsigned,
	nums int not null default 0,
	foreign key(customer_id) references customer(customer_id),
	foreign key(goods_id) references goods(goods_id)
);