1. 程式人生 > >(八)MySQL基礎——主鍵、外來鍵、修改表時新增刪除約束、標識列

(八)MySQL基礎——主鍵、外來鍵、修改表時新增刪除約束、標識列

一、主鍵和唯一的區別:

  保證唯一性 是否允許為空 一個表可以有多少個 是否允許組合
主鍵 × 至多有1個

√,但不推薦

唯一 可以有多個 √,但不推薦

唯一的性質表現在,相同列中有兩個null值都是錯誤的。

 

二、外來鍵:

1、要求在從表設定外來鍵關係

2、從表的外來鍵列的型別和主表的關聯列(對應列)的型別要求一致或相容,名稱無要求

3、主表中的關聯列必須是一個key(一般是主鍵或者是唯一)

4、要求插入資料時,先插入主表的資料,再插入從表資料;而刪除資料時,先刪除從表資料,再刪除主表資料

 

三、修改表時新增約束

1、新增列級約束的時候,語法:

ALTER   TABLE   表名   MODIFY    COLUMN    欄位名    欄位型別    新約束;

2、新增表級約束,語法:

ALTER   TABLE   表名  ADD   【CONSTRAINT   約束名】   約束型別(欄位名)   【外來鍵的引用】;

-- 建立一個表
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
    id INT,
    stuname VARCHAR(20),
    gender CHAR(1),
    seat INT,
    age INT,
    majorid INT
)

-- 新增非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;

-- 新增預設約束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;

- 新增主鍵
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
ALTER TABLE stuinfo ADD PRIMARY KEY(id);

-- 新增唯一鍵
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
ALTER TABLE stuinfo ADD UNIQUE(seat);

-- 新增外來鍵
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);

四、修改表時刪除約束

-- 刪除非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;

-- 刪除預設約束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
- 刪除主鍵
ALTER TABLE stuinfo DROP PRIMARY KEY;

-- 刪除唯一鍵
ALTER TABLE stuinfo DROP INDEX seat;

-- 刪除外來鍵
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;

五、列級約束和表級約束的區別

  位置 支援的約束型別 是否可以起約束名
列級約束 列的後面 語法都支援,但外來鍵沒有效果 不可以
表級約束 所有列的下面 預設和非空不支援,其他支援 可以

六、標識列

1、含義:又稱為自增長列,可以不用手動的插入值,系統提供預設的序列值

-- 建立表時設定標識列
CREATE TABLE tab_identity(
    id INT PRIMARY KEY AUTO_INCREMENT;
    NAME VARCHAR(20)
)
INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');

2、可以設定步長,但MySQL不支援設定偏移量

SET auto_increment_increment=3

3、特點:

(1)問:標識列必須和主鍵搭配嗎?

          答:不一定,但要求是一個key(包括主鍵、唯一、外來鍵或者自定義一個key)。

(2)問:一個表可以有幾個標識列?

          答:至多一個。

(3)問:標識列的型別有哪些?

          答:只能是數值型(int\float\double...都可以,一般是int)。

(4)可以通過手動插入值,設定起始值

-- 可以使用這樣的操作,設定起始值
INSERT INTO tab_identity(id,NAME) VALUES(10,'john');

(5)修改表時設定標識列

-- 修改表時設定標識列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;

(6)修改表時刪除標識列

-- 修改表時刪除標識列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY;