六天帶你玩轉mysql資料庫--第三天筆記(上)
阿新 • • 發佈:2018-11-07
回顧:
欄位型別(列型別):數值型,時間日期和字串型別。
數值型:整數和小數型(浮點型和定點型)
時間日期型: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;