1. 程式人生 > 其它 >06-MySQL(約束)

06-MySQL(約束)

技術標籤:MySQL

1- 約束種類

約束名約束關鍵字
主鍵primary key
非空not null
唯一unique
外來鍵foreign key … references
預設default

2-約束的作用

約束通常是在建立表結構的時候建立的,表中約束防止不符合要求的資料新增到表中,保證表中資料的正確性。如果表中已經有違反約束的資料,會導致約束建立失敗。

3- 主鍵約束

3.1 主鍵特點

唯一標識表中每一條記錄,通過主鍵來查詢到每一條記錄。

主鍵的特點:
1.非空:不能為NULL
2.唯一:不能重複

3.2 欄位作為表的主鍵

通常是能夠唯一代表這條記錄的欄位,儘量不要使用與業務相關的主鍵。如:身份證,學生證,
最好這個主鍵是沒有意義。

3.3 複合主鍵

一張表中如果有多列做為主鍵,稱為複合主鍵。需要通過多列才能唯一標識表中一行記錄。只要這幾列加到一起不重複就可以了。

3.4 建立主鍵

1.在建立表的時候給欄位新增主鍵
create table 表名(
	欄位名字 資料型別 primary key
)

2.在已有表中新增主鍵,修改表結構
alter table 表名 add primary key(列名)

案例語句

-- 使用資料庫
USE test1;

-- 建立學生表stu4,包括欄位(id, name, age)將id作為主鍵
CREATE TABLE stu4(
	id INT PRIMARY
KEY, NAME VARCHAR(20), age INT ); -- 插入主鍵值 INSERT INTO stu4 VALUES(1, "張三", 18); INSERT INTO stu4 VALUES(2, "小劉", 21); INSERT INTO stu4 VALUES(3, "李剛", 51); INSERT INTO stu4 VALUES(4, "科比", 41); -- 刪除stu4表的主鍵 ALTER TABLE stu4 DROP PRIMARY KEY; -- 表存在的情況下,新增主鍵
ALTER TABLE stu4 ADD PRIMARY KEY(id); SELECT * FROM stu4; -- stu4的結構 DESC stu4;

3.5主鍵自增長

由系統自動增長主鍵,不需要人為新增主鍵的值避免重複,auto_increment只能用在主鍵上,不能用在其它的欄位上。

語法

create table 表名(
	欄位名字 數字型別 primary key auto_increment
)

案例語句

-- 建立學生表st5, 包含欄位(id, name, age)將id做為主鍵並自動增長
CREATE TABLE stu5(
	id INT PRIMARY KEY auto_increment,
	NAME VARCHAR(20),
	age INT
);

-- 插入資料
INSERT INTO stu5(`NAME`, age) VALUES("張三", 10);
INSERT INTO stu5(`NAME`, age) VALUES("李四", 23);

-- 將主鍵的起始值設定為100
ALTER TABLE stu5 auto_increment = 100;

-- 查詢stu5
SELECT * FROM stu5;
-- stu5結構
DESC stu5;

-- 刪除自增長的值(資料表)
DELETE FROM stu5;
-- 刪除表中所有記錄
TRUNCATE stu5;

4- 唯一約束

指定某一列不能出現相同的值.

語法

create table 表名(
	欄位名 欄位型別 unique
)

案列語句

-- 建立學生表st6,包含欄位(id,name),NAME這一列設定唯一約束,不能出現同名的學生
CREATE TABLE stu6(
	id int,
	NAME VARCHAR(20) UNIQUE
);
--  表結構
DESC stu6;

-- 新增資料
INSERT INTO stu6 VALUES(1, "張三");
-- 再次新增
# INSERT INTO stu6 VALUES(2, "張三"); -- 插入失敗, Duplicate entry '張三' for key 'name'

-- 刪除資料
DELETE from stu6 WHERE id = 1;

-- 查詢表資料
SELECT * FROM stu6;

5- 非空約束

設定某列資料不能為空,必須要輸入。

語法格式:

create table 表名(
	欄位名, 欄位型別 not null
)

案列語句

# 非空約束
-- 建立表學生表st7, 包含欄位(id,name,gender)其中name不能為NULL
CREATE TABLE stu7(
	id INT,
	NAME VARCHAR(20) NOT NULL,
	age INT

);

-- 查看錶結構
DESC stu7;

-- 新增一條記錄其中姓名不賦值
# INSERT INTO stu7 VALUES(1, NULL, 20);	-- 1048 - Column 'NAME' cannot be null
# INSERT INTO stu7(id, age) VALUES(1, 30);	-- 1364 - Field 'NAME' doesn't have a default value

-- 新增資料
INSERT INTO stu7 VALUES(1, "李四", 20);
-- 查詢表中資料
SELECT * FROM stu7;

6- 預設值約束

如果一個欄位沒有設定它的值,將使用預設值。

語法格式:

create table 表名(
	欄位名 欄位型別 default 預設值
)

案列語句

# 預設值約束
-- 建立一個學生表,包含欄位(id, name, address),地址預設值是廣州
CREATE TABLE stu5(
	id INT,
	NAME VARCHAR(20),
	address VARCHAR(30) DEFAULT "廣州"
);

-- 查看錶結構
DESC stu5;

-- 新增一條記錄,使用預設地址
INSERT INTO stu5(id, `NAME`) VALUES(1, "劉菲");
INSERT INTO stu5 VALUES (2, "侯大利", DEFAULT);

-- 新增一條記錄,不使用預設地址
INSERT INTO stu5 VALUES(3, "楊帆", "深圳");
-- stu5表資訊
SELECT * FROM stu5;
-- 刪除id=3的記錄
DELETE FROM stu5 WHERE id = 3;

7-外來鍵約束

7.1 建立外來鍵

新表建立時候新增外來鍵

create table 表名 (
   外來鍵欄位名 欄位型別,
   constraint 約束名 foreign key(外來鍵欄位名)references 主表(主鍵)
)

已有表新增外來鍵

alter table 表名 add constraint 約束名 foreign key(外來鍵欄位名) references 主表(主鍵)

7.2 刪除外來鍵

alter table 從表 drop foreign key 約束名;

案例語句

USE db3;

-- 資料庫所有表
SHOW TABLES;

-- 部門表
CREATE TABLE department(
	id INT PRIMARY KEY auto_increment, -- 部門表主鍵
	dep_name VARCHAR(10), -- 部門名
	dep_location VARCHAR(20) -- 部門所在城市
);

-- 新增部門表的記錄
insert into department values(null,'刑警部', '江州'),(null, '法醫部', '陽州');

-- 員工表
CREATE TABLE employee(
	id INT PRIMARY KEY auto_increment,	-- 主鍵自增長
	NAME VARCHAR(20), -- 姓名
	age INT,
	dept_id INT -- 外來鍵,引用部門表中的主鍵
	-- CONSTRAINT fk_ep_id FOREIGN KEY(dept_id)REFERENCES department(id)
);

-- 刪除外來鍵
alter table employee drop foreign key fk_ep_id;

-- 新增從表存在的情況下新增外來鍵
alter TABLE employee ADD constraint fk_ep_id FOREIGN KEY(dept_id) REFERENCES department(id);

# 向員工表中新增元素
INSERT INTO employee (NAME, age, dept_id) VALUES ('侯大利', 27, 1);
INSERT INTO employee (NAME, age, dept_id) VALUES ('朱琳', 50, 1);
INSERT INTO employee (NAME, age, dept_id) VALUES ('張小天', 30, 1);
INSERT INTO employee (NAME, age, dept_id) VALUES ('田甜', 26, 2);
INSERT INTO employee (NAME, age, dept_id) VALUES ('老李', 42, 2);
INSERT INTO employee (NAME, age, dept_id) VALUES ('樊勇', 35, 2);

-- 查詢部門表資訊
SELECT * FROM department;

-- 查詢員工表資訊
SELECT * FROM employee;

-- 刪除表結構
DROP table department;
DROP table employee;

7.3 級聯操作

語法

寫在外來鍵約束的後面,在建立外來鍵約束的時候建立級聯操作。
級聯操作語法
級聯更新on update cascade
級聯刪除on delete cascade

案例語句

-- 刪除外來鍵約束
ALTER TABLE employee DROP FOREIGN KEY fk_ep_id;
-- 新增外來鍵約束,級聯更新和級聯刪除
ALTER TABLE employee ADD CONSTRAINT fk_ep_id FOREIGN KEY(dep_id) REFERENCES department(id) ON UPDATE ON DELETE CASCADE;

SELECT * from employee;

-- 刪除員工表id=6的值
DELETE FROM employee WHERE id = 6;
-- 把部門表中id等於2的部門改成id等於3
UPDATE department set id=3 WHERE id=2

-- 刪除部門號是3的部門
DELETE FROM department WHERE id = 3;

-- 查詢部門表資訊
SELECT * FROM department;