1. 程式人生 > >六天帶你玩轉mysql資料庫--第三天筆記(上)

六天帶你玩轉mysql資料庫--第三天筆記(上)

回顧:

欄位型別(列型別):數值型,時間日期和字串型別。
數值型:整數和小數型(浮點型和定點型)
時間日期型:datetime,date,time,timestamp,year。
字串型別:定長,變長,文字字串(text和blob),列舉(單選)和集合(多選)。
mysql的 記錄長度:65535,varchar達不到理論長度,NULL要佔用一個位元組,text文字不佔用記錄長度(但是本身佔據一個位元組)
欄位的屬性:空屬性,列描述,預設值

欄位屬性:

主鍵,唯一鍵和自增長。

主鍵:

主鍵:primary key主要的鍵,一張表中只能有一個欄位可以使用對應的鍵,用來唯一的約束欄位裡面的資料,不能重複,
這樣稱之為主鍵。一張表最多有一個主鍵。

增加主鍵:

SQL操作中有多種方式可以給表增加主鍵,大體分為三種:
方案一:在建立表的時候直接在欄位之後跟primary key關鍵字
主鍵本身不允許為空。
-- 增加主鍵
create table my_pri1(
name varchar(20) not null comment '姓名',
number char(10) primary key comment '學號:itcast + 0000,不能重複'
)charset utf8;
優點:非常直接,缺點:只能使用一個欄位作為主鍵。

在這裡插入圖片描述

方案二:

在建立表的時候,在所有的欄位之後,使用primary key(主鍵欄位列表)來建立主鍵(如果有多個欄位作為主鍵,可以是複合主鍵)
-- 複合主鍵
create table my_pri2(
number char(10) comment '學號:itcast + 0000',
course char(10) comment '課程程式碼:3901 + 0000',
score tinyint unsigned default 60 comment '成績',
-- 增加主鍵限制:學號和課程號是個對應的具有唯一性
primary key(number,course)
)charset utf8;

在這裡插入圖片描述

方案三:

當表已經建立好了之後,再次追加主鍵,一是可以修改表字段屬性,二是可以直接追加主鍵。
alter   table  表名    add    primary   key(欄位列表);

建立沒有主鍵的表:

-- 建立一個沒有主鍵的表
create table my_pri3(
course char(10) not null comment '課程編號:3901 + 0000',
name varchar(10)not null comment '課程名字'
);

desc my_pri3;

在這裡插入圖片描述

modify方式增加主鍵:

-- 增加主鍵
alter table my_pri3 modify course char(10) primary key comment '課程編號:3901 + 0000';

desc my_pri3;

在這裡插入圖片描述

alter方式增加主鍵:

create table my_pri4(
course char(10) not null comment '課程編號:3901 + 0000',
name varchar(10)not null comment '課程名字'
);
desc my_pri4;

在這裡插入圖片描述

alter table my_pri4 add primary key (course);
desc my_pri4;
前提:表中欄位對應的資料本身是獨立的(不重複)

在這裡插入圖片描述

主鍵約束:

主鍵對應的欄位中的資料不允許重複,一旦重複資料操作失敗(針對於增和改)
-- 向pri1,pri2表中插入資料
insert into my_pri1 values('xfl','itcast0001'),('xyy','itcast0002');
insert into my_pri2 values('itcast0001','39010001',90),('itcast0001','39010002',85),('itcast0002','39010001',92);

select * from my_pri1;
select * from my_pri2;

在這裡插入圖片描述

-- 主鍵衝突(重複)
insert into my_pri1 values('lh','itcast0002');   -- 不可以,主鍵衝突
insert into my_pri2 values('itcast0001','39010001',100); -- 不可以,衝突

在這裡插入圖片描述

更新主鍵 & 刪除主鍵

沒有辦法更新主鍵:主鍵必須先刪除才可以增加。
alter    table    表名     	drop     primary   key;
-- 刪除主鍵
desc my_pri3;
alter table my_pri3 drop primary key;
desc my_pri3;

在這裡插入圖片描述

主鍵分類:

在實際建立表的過程中,很少使用真實業務資料作為主鍵欄位(業務主鍵,如學號,課程號);大部分的時候使用邏輯性
的欄位(欄位沒有業務含義,值是什麼都沒有關係),將這種欄位的主鍵稱之為邏輯主鍵。
create   table   my_student(
id   int   primary   key   auto_increment    comment   '邏輯主鍵:自增長',     -- 邏輯主鍵
number   char(10)    not   null   comment   '學號',
name    varchar(10)    not  null
)

自動增長:

自增長:當對應的欄位不給值或者說是給預設值,或者給NULL的時候,會自動的被系統觸發,系統會從當前欄位中已有的最大值
再進行+1操作,得到一個新的不同的欄位。自增長通常是跟主鍵搭配。
自增長的特點:auto_increment
1.任何一個欄位要做自增長必須前提是本身的一個索引(key-欄有值),主鍵本身是一種索引。
-- 自增長
create table my_auto(
id int auto_increment comment '自動增長',
name varchar(10) not null
)charset utf8;

在這裡插入圖片描述

2.自增長欄位必須是數字而且是整型
-- 自增長
create table my_auto(
id varchar(1) primary key auto_increment comment '自動增長',
name varchar(10) not null
)charset utf8;

在這裡插入圖片描述

3.一張表只能有一個自增長

在這裡插入圖片描述

自增長的使用:

當自增長被給定的值為NULL或者預設值的時候會觸發自動增長。
自增長如果對應的欄位輸入了值,那麼自增長失效,但是下一次還是能夠正確的自增長(從最大值+1)

在這裡插入圖片描述

-- 指定資料
insert into my_auto values(6,'hsh');
insert into my_auto values(null,'csy');
select * from my_auto;

在這裡插入圖片描述

如何確定下一次是什麼自增長呢?可以通過查看錶建立語句得到。

show    create   table   my_auto;

在這裡插入圖片描述

修改自增長:

自增長如果是涉及到欄位改變,必須先刪除自增長,後增加自增長(一張表只能有一個自增長)
修改當前自增長已經存在的值,修改只能比當前已有的自增長的最大值大,不能小(小不生效)
alter    table    表名    auto_increment = 值;
-- 修改表選項的值
alter table my_auto auto_increment =4; -- 向下修改(小)
show create table my_auto;

alter table my_auto auto_increment =10; -- 向上修改(大)  
show create table my_auto;

在這裡插入圖片描述

思考:為什麼自增長是從1開始?為什麼每次自增1呢?

所有系統的表現(如字符集,校對集都是由系統內部的變數進行控制的)
檢視自增長變數:
show   variables   like   'auto_increment%';

在這裡插入圖片描述

可以修改變數實現不同的效果:修改是對整個資料的修改,而不是單張表:(修改是會話級別,單次連線有效,例如打電話)
set   auto_increment_increment = 5;
-- 修改自增長步長
set auto_increment_increment = 5;
show create table my_auto;

在這裡插入圖片描述

測試效果:自動使用自增長:

-- 插入記錄:使用自增長
insert into my_auto values(null,ly);
show create table my_auto;
select * from my_auto;

在這裡插入圖片描述

再次插入資料驗證自增長:

insert into my_auto values(null,'lyl');
select * from my_auto;

在這裡插入圖片描述

刪除自增長:

自增長是欄位的屬性:可以通過modify來進行修改(保證欄位沒有auto_increment即可)
alter   table  表名    modify   欄位   型別;
錯誤的刪除方式:
-- 刪除自增長
alter table my_auto modify id int primary key;  -- 錯誤:主鍵理論是單獨存在,不在自增長區域,系統會認為你又再一次的
增加主鍵,導致錯誤

在這裡插入圖片描述

正確的刪除主鍵的方式:

-- 正確的刪除方式
alter table my_auto modify id int;   -- 有主鍵的時候,千萬不要再次寫入主鍵重複新增

-- 檢視效果
desc my_auto;

在這裡插入圖片描述

唯一鍵:

一張表中往往有很多欄位需要具有唯一性,資料不能重複,但是一張表中只可以有一個主鍵:
唯一鍵:unique   key可以解決表中有多個欄位需要唯一性約束的問題。
唯一鍵的本質與主鍵差不多:唯一鍵預設的允許自動為空,而且可以多個為空(空欄位不參與唯一性比較)

增加唯一鍵:

基本與主鍵差不多:
方案一:在建立表的時候,欄位之後直接跟unique,unique   key即可。
-- 唯一鍵
create table my_unique1(
number char(10) unique comment '學號:唯一,允許為空',
name varchar(10) not null
)charset utf8;

desc my_unique1;

在這裡插入圖片描述

方案二:在所有的欄位之後增加unique   key(欄位列表);  -- 複合唯一鍵
-- 建立唯一鍵的錯覺
create table my_unique2(
number char(10) not null comment '學號',
name varchar(10) not null,
-- 增加唯一鍵
unique key(number)
)charset utf8;

desc my_unique2;

在這裡插入圖片描述

show    create   table    my_unique2;

在這裡插入圖片描述

方案三:在建立表之後增加唯一鍵
-- 建立表
create table my_unique3(
id int primary key auto_increment,
number char(10) not null,
name varchar(20) not null
)charset utf8;
-- 檢視沒有唯一鍵
desc my_unique3;
-- 增加唯一鍵
alter table my_unique3 add unique key(number);
desc my_unique3;

在這裡插入圖片描述

唯一鍵約束:

唯一鍵與主鍵的本質相同:唯一的區別就是唯一鍵預設允許為空而且可以多個為空。
插入資料
-- 首先進行檢視
desc my_unique1;
-- 插入資料
insert into my_unique1 values(null,'lzg'),('itcast0001','cs'),(null,'ls');
-- 再次檢視
desc my_unique1;
select * from my_unique1;

在這裡插入圖片描述

驗證唯一鍵約束:

如果唯一鍵也不允許為空,與主鍵的約束作用就是一致的。
-- 不為空的欄位重複插入會報錯
insert into my_unique1 values('itcast0001','cf');

在這裡插入圖片描述

更新唯一鍵和刪除唯一鍵:

更新唯一鍵先刪除在新增(唯一鍵有多個,可以不刪除,對同一個欄位使用的話需要先刪除)
刪除唯一鍵:
alter    table    表名   drop   unique  key;   -- 錯誤,因為唯一鍵存在很多個
alter    table    表名   drop   index   索引名字;  --  唯一鍵預設使用欄位名作為索引名字
-- 刪除唯一鍵
desc my_unique3;
alter table my_unique3 drop index number;
desc my_unique3;

在這裡插入圖片描述