Python-數據類型 主鍵auto_increment

MySQL數據操做: DML
========================================================
在MySQL管理軟件中,能夠經過SQL語句中的DML語言來實現數據的操做,
包括:
使用INSERT實現數據的插入
UPDATE實現數據的更新
使用DELETE實現數據的刪除
使用SELECT查詢數據以及。
========================================================


1.詳細的建表語句 *****
create table 表名(
字段名1 數據類型[(長度) 約束條件],
字段名2 數據類型[(長度) 約束條件]
);

解釋:
類型:使用限制字段必須以什麼樣的數據類型傳值
約束條件:約束條件是在類型以外添加一種額外的限制
爲何須要給數據分類?(189 一八九)
1.描述數據更加準確
2.節省內存空間
注意:
1. 在同一張表中,字段名是不能相同
2. 寬度和約束條件可選,字段名和類型是必須的
三、最後一個字段後不加逗號
create database db37;

insert 語句
insert into 表名 values(值1,值n,....)
要求值得順序 個數 必須與表字段徹底對應
另外一種寫法
insert into 表名(字段名1,字段名n,....) values(值1,值n,....)
能夠選擇性得插入某些字段 要求值得順序 必須與表名後面聲明得字段一致

2.數據類型 *****
整數類型
一、做用:id號,各類號碼,年齡,等級
二、分類:
整型的存儲寬度是規定死的,咱們指定寬度是顯示寬度,一般使用默認的顯示寬度
tinyint(**)1字節 (-128,127)
smallint 2字節
mediumint 3字節
int (*****) 4字節
bigint(***)8字節

三、測試:
默認有符號的
設置爲無符號unsigned
1.create table t2(age tinyint unsigned);
2.建表後用alter修改

create table t2(x tinyint unsigned);
insert into t2 values(-1),(256);

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

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

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

總結:除了存儲範圍沒啥區別
都是整型
默認有符號
對於顯示寬度 原理是相同的

長度參數若是不指定 會有默認值(3)

嚴格模式
什麼是嚴格模式
對插入的數據嚴格要求 再也不範圍內直接報錯
例如往tinyint中插入大於255的值將報錯
什麼是非嚴格模式
不對插入的數據嚴格要求 再也不範圍內也能夠保存
保存的當前類型最大支持的值

5.6默認是非嚴格模式
5.7之後默認嚴格模式

查看SQL模式
select @@sql_mode;
show variables like "sql_mode";
show variables like "%sql_mode%";

修改SQL模式
set @@sql_mode = "值";
正常狀況不須要改
+----------------------------+---------------------+
| Variable_name | Value |
+----------------------------+---------------------+
| binlogging_impossible_mode | IGNORE_ERROR |
| block_encryption_mode | aes-128-ecb |
| gtid_mode | OFF |
| innodb_autoinc_lock_mode | 1 |
| innodb_strict_mode | OFF |
| pseudo_slave_mode | OFF |
| slave_exec_mode | STRICT |
| sql_mode | STRICT_TRANS_TABLES |
+----------------------------+---------------------+
8 rows in set (0.00 sec)

#修改sql_mode爲嚴格模式:在該模式下,若是插入的數據超過限制,則會當即報錯
mysql> set global sql_mode="strict_trans_tables";

浮點類型
做用:存儲身高、體重、薪資
分類:
float (*****)4字節 單精度浮點 知足大部分使用場景
double (**)8字節雙精度浮點
decimal (**)不固定 精準小數 適合銀行系統 科學研究等
create table t9(num float(m,d))
m 表示總長度 d 表示小數部分的長度
長度表示不是數據存儲範圍 而是字符長度
10.12 總長爲4 小數部分爲2

各個類型的最大長度
float (255,30) ***** 括號內不填,默認沒有小數,整數非零的數字顯示6位
double (255,30)
decimal (65,30)

區別:
float與double的精度不一樣 都是不許確的小數
decimal 準確的小數 不會丟失精度

括號中m和d的值 能夠限制數據存儲範圍 與整型不一樣
重點:記住m和d的含義
測試:
#相同點
一、對於三者來講,都能存放30位小數,
#不一樣點:
一、精度的排序從低到高:float,double,decimal
二、float與double類型能存放的整數位比decimal更多


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


mysql> select * from t9;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t10;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t11;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
1 row in set (0.00 sec)

字符串類型
一、做用:姓名,地址,描述類的信息

二、分類:
char 定長字符串 使用頻率更高
varchar 可變長度字符串
注意字符串中 長度指定的是數據的字符長度 與字節不要緊

create table t13(c1 char,c2 varchar(10));
在建立時 varchar必須指定長度 char有默認值 (1)

不一樣點:
a char(3) b char(3)
A |B |
char類型在取數據時 就根據長度來獲取 不關心真實數據長度
不管的數據有多長 佔用的空間是固定的 形成了必定空間浪費
name char(5)
# 缺點:浪費空間
# 優勢:存取速度都快
egon alex lxx wxx yx

a varchar(30) b varchar(30)
(1)A(1)B
varchar類型在取數據時 先獲取數據長度 在根據長度獲取真實數據 關心真實數據長度
先存儲長度須要一個字節 再存儲真實數據 不會浪費空間
可是 因爲須要計算數據的長度 因此存取速度會比定長慢
name varchar(5)
# 缺點:存取速度都慢
# 優勢:節省空間
(1bytes+egon)(1bytes+alex)(1bytes+lxx)

相同點:
括號中的數字 都是表示存儲最大字符長度

mysql會在存儲數據時自動將數據末尾的空格去掉
若是必需要存空格 須要修改sql_mode 增長 PAD_CHAR_TO_FULL_LENGTH 意思是把空格看成有效數據

# 注意:
因爲自動去除空格這個機制 在使用等於符號 和like時有區別
select *from t1 where name = "yh "; name字段明確地等於一個值,該值後填充空格是沒有用,會自動去除空格
select *from t1 where name like "yh "; name字段模糊匹配一個值,該值後填充空格是有用的,不會自動去除空格
like 用於模糊匹配 使用%表示0或任意個任意字符 使用_表示一個任意字符

三、測試:字符的寬度限制單位是字符個數
create table t12(x char(4)); # 超出4個字符則報錯,不夠4個字符則用空格補全成4個字符
create table t13(y varchar(4));# 超出4個字符則報錯,不夠4個字符那麼字符有幾個就存幾個

insert into t12 values('hello');
insert into t13 values('hello');

insert into t12 values('a'); #'a '
insert into t13 values('a'); #'a'

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

日期和時間
一、做用:時間相關
二、分類:
year:1999
date:1999-01-27
time: 11:11:11
datetime*****:1999-01-27 11:11:11
timestamp *****
timestamp特色是:能夠給null 自動輸入當前時間 當這條記錄被修改了會自動更新當前時間
三、測試
create table student(
id int,
name char(16),
born_year year,
birth date,
class_time time,
reg_time datetime
);

insert into student values(1,'egon','2000','2000-01-27','08:30:00','2013-11-11 11:11:11');

枚舉
枚舉enum,多選一個
enum 能夠指定一堆字符串的值 在插入數據時 數據必須這堆字符串中的其中一個 ("男的","女的") 多選一
集合
集合set,多選多
set 能夠指定一堆字符串的值 在插入數據時 數據必須這堆字符串中的其中一個或多個 ("男的","女的") 多選多
枚舉和集合共同點:數據都是字符串類型
測試
create table teacher(
id int,
name char(16),
sex enum('male','female','others'),
hobbies set('play','read','music','piao')
);
insert into teacher values('male','read,music')

3.約束****
是一種對數據限制
已經學習過的 數據類型 unsigned無符號 字符串長度 浮點的長度

約束的做用是?
爲了保證數據的正確性,完整性
例如要存儲密碼 char(20) 只限制了類型和長度, 沒法保證數據的正確性

額外的約束
語法:
建立時指定約束
create table 表名稱(字段名 類型(長度) 約束名稱1 約束名稱n,....)
後期修改的方式添加 約束
alter table 表名稱 modify 字段名 類型(長度) 約束名稱1 約束名稱n,....
unsigned 整形,無符號
NOT NULL 非空約束 限制該字段的值不能爲空
UNIQUE 惟一性約束 限制該字段的值是惟一的不能出現重複
DEFAULT 默認值約束 若是插入數據時沒有指定該字段的值則使用默認值
PRIMARY KEY 主鍵約束 限制該字段 不能爲空 而且是惟一的 能夠惟一標識一條數據 *****
FOREIGN KEY 外鍵約束 用來指向另外一個表的主鍵
auto_increment 自動增加,只能加在整形上且必須有索引和key配合,默認起始位置是1,步長也爲1

mysql中存在一種專門的數據結構,叫key,又稱爲索引,經過該數據結構能夠減小io次數,從而加速查詢效率
index key : 只有加速查詢的效果,沒有約束的功能
unique key:不只有加速查詢的效果,還附加了一種約束的功能
primary key:不只有加速查詢的效果,還附加了一種約束的功能,而且innodb存儲引擎會按照主鍵字段的值
來組織表中全部的數據,因此一種inndob表中必須有、並且只能有一個主鍵,一般該表的id字段

#not null + default測試
create table t15(
id int,
name char(16) not null,
sex enum('male','female','other') not null default "male"
);

alter table t15 modify name char(16) not null;

insert into t15(id,name) values
(1,'egon1'),
(2,'egon2'),
(3,'egon3');

每個表都應該有一個主鍵 須要惟一標識 不然能夠可能出現徹底相同的兩個數據 沒法區分
UNIQUE 不能重複 可是能夠爲空 這樣也不能惟一標識
UNIQUE NOT NULL 不能爲空且惟一 能夠惟一標識一條數據 書寫順序無所謂


UNIQUE NOT NULL 與 主鍵的區別
UNIQUE NOT NULL 不能被其餘表引用 (不能做爲其它表的外鍵)
UNIQUE NOT NULL 約束一個表中能夠有多個 可是主鍵只能有一個
#unique:限制字段的值惟一

#單列惟一
create table t16(
id int unique,
name char(16)
);

# 聯合惟一
create table server(
id int unique,
ip char(15),
port int,
unique(ip,port) #!!!!!
);


索引:用於加速查詢
InnoDB 中 索引是樹形結構
爲了提升查詢效率 InnoDB爲找一個不爲空 且惟一的字段做爲主鍵
若是表中不存在這樣的字段 會自動幫你建一個隱藏主鍵字段 可是沒法提高查詢效率

只要是使用innoDB 就應該爲每一個表指定一個非空 且惟一的字段
InnoDB阻止數據時 首先使用主鍵 若是沒有主鍵 找一個非空且惟一 若是也沒有 建一個隱藏字段


多字段聯合主鍵: 不經常使用
學生表 stu_id course_id 作爲聯合主鍵,只有當兩個字段都重複纔算重複
1 1 已有數據
1 2 能夠插入
2 1 能夠插入
1 1 不能插入

#primary key:單單從約束角度去看,primary key就等同於not null unique
#強調(******)
一、一張表中必須有,而且只能有一個主鍵
二、一張表中都應該有一個id字段,並且應該把id字段作成主鍵
如一張表中沒有主鍵,第一個not null unique的字段會默認成爲主鍵

create table t17(
id int primary key,
name char(16),
age int,
sex char(6)
)engine=innodb;

#聯合主鍵
create table t19(
ip char(15),
port int,
primary key(ip,port) #!!!!
);




# auto_increment注意點:
一、一般與primary key連用,並且一般是給id字段加
二、auto_incremnt只能給被定義成key(unique key,primary key)的字段加

# primary key auto_increment
create table t20(
id int primary key auto_increment,
name char(16)
)engine=innodb;

當一個表中 因爲業務需求沒有一個非空且惟一的字段時 咱們能夠建一個新的字段專門做爲主鍵
管理主鍵的值挺麻煩的 你得記錄上一次的主鍵值
mysql能夠幫你自動管理主鍵 auto_increment 自動增加
auto_increment 只能用於整型字段 而且該字段必須具有索引
因此 一般 主鍵都會加上auto_increment

手動修改自動增加計數
alter table 表名 auto_increment 新的值;
注意:若是新的值小於當前的最大值 是無效的

一般建一個表就要建一個主鍵 主鍵的類型一般是整型


存儲引擎

mysql中創建的庫===>文件夾
庫中創建的表===>文件

現實生活中咱們用來存儲數據的文件有不一樣的類型,每種文件類型對應各自不一樣的處理機制:
好比處理文本用txt類型,處理表格用excel,處理圖片用png等
數據庫中的表也應該有不一樣的類型,表的類型不一樣,會對應mysql不一樣的存取機制,表類型又稱爲存儲引擎。

存儲引擎說白了就是如何存儲數據、如何爲存儲的數據創建索引和如何更新、查詢數據等技術的實現方法。
由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和操做此表的類型)

在Oracle 和SQL Server等數據庫中只有一種存儲引擎,全部數據存儲管理機制都是同樣的。
而MySql數據庫提供了多種存儲引擎。用戶能夠根據不一樣的需求爲數據表選擇不一樣的存儲引擎,用戶也能夠根據
本身的須要編寫本身的存儲引擎

發動機
汽油機
柴油機 柴油價格便宜 動力還強 噪音大 不徹底燃燒
電機 加速快 噪音小 續航問題

一個產品或服務的核心部分稱之爲引擎
mysql的核心功能存取數據
mysql存儲引擎就是負責存取數據那一段代碼

InnoDB!!! 默認,支持事物,行級鎖,外鍵,支持外鍵,存儲時1個文件
MyISAM 不支持事物,表級鎖,不支持外鍵. 支持存儲結構體 ,例如point x座標y座標 支持空間索引,存儲時3個文件(數據,結構,事務)


    Blackhole 寫進去就沒了    Memory    存在內存中 斷電易失
相關文章
相關標籤/搜索