python全棧開發_day38_數據庫2

表操做

今日內容

1.數據類型

建表的時候,字段都有對應的數據類型html

  • 整型mysql

  • 浮點型sql

  • 字符類型(char與varchar)數據庫

  • 日期類型安全

  • 枚舉與集合session

2.約束條件

  • primary key測試

  • unique keyspa

  • not nullcode

  • foreign keyserver

詳細內容

建立表的完整語法

#語法:
create table 表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件]
);

#注意:
1. 在同一張表中,字段名不能相同
2. 寬度和約束條件可選,字段名和類型是必須的
3. 最後一個字段後不能加逗號!

# 補充:
# 1.寬度指的是對存儲數據的限制
create table userinfo(name char);
insert into userinfo values('jason');
"""
1.沒有安全模式的數據庫版本,可以存放數據可是隻會存進去一個j
2.最新數據庫版本直接報錯提示沒法存儲:Data too long for column 'name' at row 1
"""

# 2.約束條件初識>>> null 與 nut null
create table t1(id int,name char not null);
insert into t1 values(1,'j');  # 正常存儲
insert into t1 values(2,null);  # 報錯

# 總結 類型與約束條件區別
# 類型:限制字段必須以什麼樣的數據類型存儲
# 約束條件:約束條件是在類型以外添加一種額外的限制

基本數據類型

整型

  • 分類:TINYINT SMALLINT MEDIUMINT INT BIGINT

  • 做用:存儲年齡,等級,id,各類號碼等

類型存儲範圍:參考圖片http://www.cnblogs.com/linhaifeng/articles/7233411.html

驗證整型字段有無符號及範圍

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);

疑問:類型後面的寬度可否改變字段存儲的大小限制

create table t4(x int(8));
insert into t4 values(4294967296123);

# 顯示時,不夠8位用0填充,若是超出8位則正常顯示
create table t5(x int(8) unsigned zerofill);
insert into t5 values(4294967296123);

# create table t6(id int(10) unsigned);
# create table t7(id int(11));

強調:對於整型來講,數據類型後的寬度並非存儲限制,而是顯示限制,因此在建立表時,若是字段採用的是整型類型,徹底無需指定顯示寬度, 默認的顯示寬度,足夠顯示完整當初存放的數據

嚴格模式補充

咱們剛剛在上面設置了char,tinyint,存儲數據時超過它們的最大存儲長度,發現數據也能正常存儲進去,只是mysql幫咱們自動截取了最大長度。但在實際狀況下,咱們應該儘可能減小數據庫的操做,緩解數據庫的壓力,讓它僅僅只管理數據便可,這樣的狀況下就須要設置安全模式

show variables like "%mode%";  # 查看數據庫配置中變量名包含mode的配置參數
# 修改安全模式
set session # 只在當前操做界面有效
set global  # 全局有效

set global sql_mode ='STRICT_TRANS_TABLES'
# 修改完以後退出當前客戶端從新登錄便可

浮點型

  • 分類:FLOAT DOUBLE decimal

  • 應用場景:身高,體重,薪資

字段限制特色(5,3)前一位表示全部的位數,後一位表示小數個數

三者最大整數位和小數位對比:

# 存儲限制
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);

字符類型

  • 分類

    • 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

時間類型

  • 分類

    • date:2019-05-01

    • time:11:11:11

    • Datetime: 2019-01-02 11:11:11

    • Year:2019

  • 測試

    create table student(
    id int,
    name char(16),
    born_year year,
    birth date,
    study_time time,
    reg_time datetime
    );
    insert into student values(1,'egon','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');

枚舉與集合類型

  • 分類

    • 枚舉enum 多選一

    • 集合set 多選多

  • 測試

    create table user(
    id int,
    name char(16),
    gender enum('male','female','others')
    );
    insert into user values(1,'jason','xxx')  # 報錯
    insert into user values(2,'egon','female')  # 正確!


    create table teacher(
    id int,
    name char(16),
    gender enum('male','female','others'),
    hobby set('read','sleep','sanna','dbj')
    );
    insert into teacher values(1,'egon','male','read,sleep,dbj')  # 集合也能夠只存一個

約束條件

"""
PRIMARY KEY (PK)   標識該字段爲該表的主鍵,能夠惟一的標識記錄
FOREIGN KEY (FK)   標識該字段爲該表的外鍵
NOT NULL   標識該字段不能爲空
UNIQUE KEY (UK)   標識該字段的值是惟一的
AUTO_INCREMENT   標識該字段的值自動增加(整數類型,並且爲主鍵)
DEFAULT   爲該字段設置默認值

UNSIGNED 無符號
ZEROFILL 使用0填充
"""

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')  # 成功

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);

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的字段加

補充:

delete from tb1;
強調:上面的這條命令確實能夠將表裏的全部記錄都刪掉,但不會將id重置爲0,
因此收該條命令根本不是用來清空表的,delete是用來刪除表中某一些符合條件的記錄
delete from tb1 where id > 10;

若是要清空表,使用truncate tb1;
做用:將整張表重置,id從新從0開始記錄
相關文章
相關標籤/搜索