列屬性(主鍵、唯一鍵和自增等)
資料表中,真正約束欄位的是資料型別。但是資料型別的約束很單一,需要有一些額外的約束,來更加保證資料的合法性。
查看錶資料結構
- 紅色表示資料型別;
- 藍色表示列屬性;
列屬性有很多,大致如下:
NOT NULL/NULL,
DEFAULT,
PRIMARY KEY,
UNIKUE KEY,
AUTO_INCREMENT,
COMMENT
【1】空屬性
其有兩個值:null(預設值) 和 not null (不為空) ;
雖然預設的資料庫基本欄位為空,但是生產環境中儘可能保證欄位都不為空。空資料沒有意義,且無法參加運算。
select 1+'hello' ,null,1+null;
【2】列描述
comment:描述,沒有實際含義,為列增加文字說明,會隨著表建立一起儲存起來。
【3】預設值
default:某一種資料會經常性的出現某個具體的值,可以在一開始指定好,使用者可以在使用的時候選擇性的使用預設值或插入新資料。
create table my_default(
name VARCHAR(20) not null unique key ,
gender varchar(4) DEFAULT '男'
)charset utf8;
desc my_default;
insert into my_default values ('tom',null);--gender為null
insert into my_default values('lily',DEFAULT);-- default,gender取預設值
select * from my_default;
- 當不對gender列進行插入的時候,gender將會使用預設值
insert into my_default (name) VALUE ('lir');--指定列,gender取預設值
select * from my_default;
可見,指定列 與 values使用default 兩種方式都可以使具有預設值的列,在插入資料的時候使用預設值。
【4】主鍵
primary key :一張表只能有一個欄位可以使用對應的鍵,用來唯一的約束該欄位裡面的資料,不能重複。主鍵本身一定不為空,且不允許重複。
給表增加主鍵,大體分為三種:
① 建立表的時候在欄位後面使用 primary key關鍵字;
create table my_default(
id int PRIMARY KEY,--使用關鍵字
name VARCHAR(20) not null unique key ,
gender varchar(4) DEFAULT '男'
)charset utf8;
② 在建立表的時候,在所有的欄位之後使用 primary key(主鍵的欄位 列表)來建立主鍵(如果有多個欄位作為主鍵,稱之為複合主鍵)
create table my_pri(
number char(10),
course char(10),
score TINYINT,
PRIMARY KEY(number,course)--複合主鍵
)charset utf8;
desc my_pri;
測試如下:
insert into my_pri VALUES('001','IT','10');--插入成功
insert into my_pri VALUES('001','IT','10');--插入失敗
insert into my_pri VALUES('001','IT2','10');--插入成功
③ 建立表之後,為表追加主鍵。有兩種方式,第一位修改表字段屬性;第二直接追加。
第一種方式示例如下:
alter TABLE my_pri MODIFY number char(11) PRIMARY KEY;
第二種方式示例如下:
alter table table_name add primary key(column) ;
--alter TABLE my_pri add PRIMARY KEY(number,course);--增加複合主鍵
--alter table my_pri add CONSTRAINT pk_score PRIMARY KEY(score)--使用關鍵字CONSTRAINT 且指定主鍵名字pk_score
--alter table my_pri add CONSTRAINT PRIMARY KEY(score)--使用關鍵字CONSTRAINT 且使用預設名字
刪除主鍵:
alter table my_pri drop PRIMARY KEY;
--不能根據主鍵名字刪除,因為只有一個主鍵
【主鍵分類】
在實際建立表的過程中,很少使用真實的業務 資料作為主鍵欄位(業務主鍵,如課程號,學號);大部分時候是使用邏輯性欄位(欄位沒有什麼業務含義,值是什麼都沒有關係),將這種欄位主鍵稱之為邏輯主鍵。
【5】自動增長
| - - |
auto_increment:當對應的欄位,不給值 || 給預設值 || 給null 值,會自動的被系統觸發。
系統會從當前欄位中已有的最大值進行+1操作,得到一個新的不同的欄位,作為下一次插入資料是自增長欄位的值。若手動修改了auto_increment,且為向上修改,那麼下一次值為auto_increment!
自增長通常跟主鍵搭配。
自增長特定:
① 任何一個欄位要做自增長前提必須是一個索引;
② 自增長欄位必須是整型數字;
| -
測試如下
create table my_auto(
id int auto_increment ,
name varchar(20)
)charset utf8;
--失敗
| - 說明自增長欄位必須是key(索引)- |
正確如下:
create table my_auto(
id int primary key auto_increment ,
name varchar(20)
)charset utf8;
插入資料
insert into my_auto values(null,'tom');
insert into my_auto values('','tom2');--插入失敗
insert into my_auto values('null','tom3');--插入失敗
insert into my_auto values(DEFAULT,'tom4');
其中,第二、三將會插入失敗–主鍵不能為空:
第一、四插入null 或者預設值,將會自動增長並插入:
如果自增長對應的欄位輸入了值,那麼自增長失效。下一次插入資料,仍舊會獲取 最大值+1:
insert into my_auto values(5,'tom5');
insert into my_auto values(default,'tom6');
select * from my_auto;
【修改自增長】
自增長如果是設計到欄位改變,必須先刪除自增長,後增加(一張表只能有一個自增長);
修改當前自增長已存在的值,修改只能比最大值大,不能小(小不生效)。
語法如下:
alter table table_name auto_increment = 值 ;
測試 向下修改:
alter table my_auto auto_increment=3;--現在資料表已存在最大值7
show create table my_auto;
CREATE TABLE `my_auto` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
--此時AUTO_INCREMENT=8 ,故向下修改無效
測試 向上修改:
alter table my_auto auto_increment=10;
show create table my_auto;
CREATE TABLE `my_auto` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
--可以向上修改
插入資料測試:
insert into my_auto VALUES(null,'Lucy');
select * from my_auto ;
此時id為10!!!
演示到這裡,有沒有一個疑問:為什麼自增長是從1開始?
我們知道,所有系統的表現(如字符集,校對集)都是由系統內部的變數進行控制的。
檢視自增長對應的變數:show VARIABLES LIKE '%auto_increment%'
auto_increment_increment 1 --步長值
auto_increment_offset 1 --起始值
可以修改變數實現不同的效果。但是修改是對整個資料庫進行修改而不是單張表,且修改是會話級別,關閉並重新開啟連結,變數恢復預設值。
set auto_increment_increment = 2;
show VARIABLES LIKE '%auto_increment%';
變數修改後,在第二次插入資料時候生效:
- 因為修改變數並不會立即更新表選項的auto_increment,當再插入資料後,會更新auto_increment ,此時檢測到步長已經改變,故之後插入資料會使用新的步長值!!
insert into my_auto values(null,'Lucy12');
insert into my_auto values(null,'Lucy12');
select * from my_auto;
【刪除自增長】
自增長不能通過drop消除,只能通過modify column;
需要注意的是,如果自增長對應的欄位為主鍵,那麼修改 列屬性的時候,不要再加primary key ; 會被系統認為又定義一個主鍵,將會提示”Multiple primary key defined”
alter table my_auto modify id int primary key;
--錯誤,會被認為又定義一個主鍵;
alter table my_auto modify id int ;
--正確,且不會丟失掉 id 的主鍵
【6】唯一鍵
一張表往往有很多欄位需要唯一性,資料不能重複;但是一張表只能有一個欄位為主鍵,那麼唯一鍵(unique key),就可以解決表中有多個欄位需要唯一性約束的問題。
唯一鍵預設值允許自動為空,而且可以多個不同欄位為空—空欄位不參與唯一性比較。
【增加唯一鍵】
分為建立表和建立後兩種方式:
① 建立表時(又分兩種):
--第一種,欄位增加
create table my_unique(
name varchar(4) unique key,
number varchar(20) unique key
)charset utf8;
--第二種,欄位末尾增加
create table my_unique(
name varchar(4) ,
number varchar(20) ,
unique key name(name),--指定唯一約束名字
unique key(number)--使用預設名字
)charset utf8;
② 建立表後(又分兩種):
-- 建立表,不帶唯一約束
create table my_unique(
name varchar(4) ,
number varchar(20)
)charset utf8;
--第一種,modify column
alter table my_unique modify column name varchar(5) UNIQUE KEY;
--第二種 add constraint unique key
alter TABLE my_unique add CONSTRAINT num_uk UNIQUE KEY(number);
--指定唯一約束名字為num_uk
【刪除唯一約束】
alter table my_unique drop index num_uk;
--根據指定約束名字刪除,若建立的時候未指定名字,預設使用列名作為唯一約束名字。
CREATE TABLE `my_unique` (
`name` varchar(5) DEFAULT NULL,
`number` varchar(20) DEFAULT NULL,
UNIQUE KEY `num_uk` (`number`),--唯一約束名字為num_uk
UNIQUE KEY `name` (`name`)--唯一約束名字預設為列名
) ENGINE=InnoDB DEFAULT CHARSET=utf8
下面演示一個有趣的現象:
--建立表
create table my_unique(
name varchar(4) not null,--注意這裡 not null
number varchar(20)
)charset utf8;
--增加唯一約束
alter table my_unique modify column name varchar(5) not NULL UNIQUE KEY;
--查看錶結構
desc my_unique;
注意key那一列,顯示 PRI 不是UNI!!!
解釋如下:該表沒有主鍵;剛好是一個不為空的唯一鍵,性質和主鍵一樣。故MySQL無法判斷,顯示了PRI。當表中已經存在主鍵,則會正常顯示為UNI
【複合唯一約束】
--第一種建立方式
create table my_unique(
name varchar(4) not null,
number varchar(20) ,
unique KEY na_um_un(name,number)--欄位末尾建立,使用指定名
)charset utf8;
desc my_unique;
- 插入資料
insert into my_unique values('tom','1001');
insert into my_unique values('tom','1001');
- 提示資料重複–約束名字為 na_um_un(建立時候指定的名字)
--第二種建立方式
--建立空表,不帶約束
create table my_unique(
name varchar(4) not null,
number varchar(20)
)charset utf8;
--增加複合約束
alter TABLE my_unique add CONSTRAINT num_na_uk UNIQUE KEY(number,name);
--查看錶結構
desc my_unique;
- 刪除指定名字複合約束
alter table my_unique drop index num_na_uk;
刪除預設名字複合約束
- 若不指定名字,那麼複合約束名字為第一個欄位名字
alter TABLE my_unique add CONSTRAINT UNIQUE KEY(number,name);
--查看錶建立語句
show create TABLE my_unique;
CREATE TABLE `my_unique` (
`name` varchar(4) NOT NULL,
`number` varchar(20) DEFAULT NULL,
UNIQUE KEY `number` (`number`,`name`)--這裡,名字為number
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--刪除複合約束
alter table my_unique drop index number;
另外,唯一鍵同樣是索引的型別,故唯一鍵的新增刪除可以如下:
ALTER TABLE `weight_num_curr_detail`
DROP INDEX `unque_store_brand` ;
ADD UNIQUE INDEX `unque_store_brand` (`store_code`, `brand_code`, `year_num`) USING BTREE ;