1. 程式人生 > >列屬性(主鍵、唯一鍵和自增等)

列屬性(主鍵、唯一鍵和自增等)

資料表中,真正約束欄位的是資料型別。但是資料型別的約束很單一,需要有一些額外的約束,來更加保證資料的合法性。

查看錶資料結構

  • 紅色表示資料型別;
  • 藍色表示列屬性;

這裡寫圖片描述

列屬性有很多,大致如下:

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 ;