首頁 > 軟體

MySQL約束(建立表時的各種條件說明)

2022-06-21 14:10:35

由於增刪改了emp表中的記錄,因此這裡重新建立了一個指令碼並使用

create database bjpowernnode;
use bjpowernode;
source C:UsersAdministratorDesktopbjpowernode.sql;

約束

1.什麼是約束?

  • 約束就是表中的限制條件
  • 約束的關鍵字是:constraint

2. 約束的分類

  • 非空約束     not null
  • 唯一性約束   unique
  • 主鍵約束     primary key
  • 外來鍵約束     foreign key
  • 檢查約束     MySQL資料庫不支援,Oracle資料庫支援

1. not null(非空約束)

not null約束的欄位,不能為null值,必須給具體的資料

建立表,給欄位新增 非空約束【使用者的郵箱地址不能為空】

drop table if exists t_user;
create table t_user(
        id int(10),
        name varchar(32) not null,
        email varchar (32)
);

2. unique(唯一性約束)

建立表,保證郵箱地址唯一

create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128) unique
);

unique約束的欄位不能重複,但是可以為null

以上的約束屬於列級約束

表級約束:

 create table t_user(
     id int(10),
     name varchar(32),
     email varchar(128),
     unique(email)
 );

 1.使用表級約束給多個欄位新增約束

 create table t_user(
     id int(10),
     name varchar(32),
     email varchar(128),
     unique(name,email)
);

2.表級約束可以給約束起名,以後通過這個名字來刪除約束

   create table t_user(
       id int(10),
       name varchar(32),
       email varchar(128),
       constraint t_user_email_unique unique(email)
 );

not null 和unique可以聯合使用

3. primary key (主鍵約束)

1.主鍵涉及到的術語:

  • 主鍵約束
  • 主鍵欄位
  • 主鍵值

2.以上三者之間的關係:

  • 表中的某個欄位新增主鍵約束之後,該欄位稱為主鍵欄位
  • 主鍵欄位中出現的每一個資料都被稱為主鍵值

3.給某個欄位新增主鍵約束以後,該欄位不能重複,也不能為空

  • 主鍵約束效果和''not null unique'' 相同,但是本質不同,
  • 主鍵約束除了可以做到''not null unique''之外
  • 主鍵欄位還會預設新增''索引-index''

4. 一張表應給有主鍵欄位,如果沒有,表示這張表是無效的

  • 主鍵值是當前行資料的唯一標識
  • 主鍵值是當前行資料的身份證號碼
  • 即使表中的兩行記錄資料是完全相同的,
  • 但是由於主鍵值不同,就認為這是兩行完全不同的欄位

5.無論是單一主鍵還是複合主鍵,一張表的主鍵約束只能有一個

  • 給一個欄位新增主鍵約束,被稱為單一主鍵約束
  • 給多個欄位聯合新增主鍵約束,被稱為複合主鍵

6.主鍵根據性質分類:

  • 自然主鍵:主鍵值是一個自然數,這個主鍵和當前的業務沒有關係
  • 業務主鍵:主鍵值和當前業務緊密相關
  • 當業務發生改變的時候,主鍵值通成會受到影響,所以業務主鍵之用很少。

單一主鍵,列級約束

create table t_user(
    id int(10) primary key,
    name varchar(32)
);

單一主鍵,表極約束

 create table t_user(
     id int(10),
     name varchar(32),
     primary key(id)
);

複合主鍵:只能用表級約束

mysql> create table t_user(
    -> id int(10),
    -> name varchar(32),
    -> primary key(id,name)
    -> );

auto_increment:主鍵自增

MySQL資料管理系統中提供了一個自增的數位,專門用來自動生成主鍵值

主鍵值不需要使用者維護,也不需要使用者提供了,自動生成的,

這個自增的數位預設從1開始以1遞增:1,2,3,4,....

mysql> create table t_user(
    -> id int(10) primary key auto_increment,
    -> name varchar(32)
    -> );

4. foreign key(外來鍵約束)

1.外來鍵約束涉及到的術語:

  • 外來鍵約束
  • 外來鍵值
  • 外來鍵欄位

2.以上三者之間的關係:

  • 某個欄位新增外來鍵約束以後稱為外來鍵欄位
  • 外來鍵欄位中的每一個資料稱為外來鍵值

3.外來鍵分為單一外來鍵和複合外來鍵

  • 單一外來鍵:給一個欄位新增外來鍵約束
  • 複合外來鍵:給多個欄位新增外來鍵約束

4.一張表中可以有多個外來鍵欄位

設計一個資料庫表,用來儲存學生和班級資訊,給出兩種解決方案:

學生資訊和班級資訊之間的關係:一個班級對應多個學生,這是典型的一對多的關係

在多的一方加外來鍵

第一種設計方案:將學生資訊和班級資訊儲存到一張表中

第二種設計方案:將學生資訊和班級資訊分開兩張表儲存,學生表+班級表

  • 學生表 t_student
sno(主鍵約束)snameclassno(外來鍵約束)
1jack100
2lucy100
3kk100
4smith200
5frank300
6jhh300
  • 班級表t_calss
cno(主鍵約束)cname
100高三1班
200高三2班
300高三3班

為了保證t_student 表中的classno欄位中的資料必須來自於t_class表中的cno欄位中的資料,有必要給t_student表中的classno欄位新增外來鍵約束,classno稱為外來鍵欄位,該欄位中的值稱為外來鍵值。

注意:

1.外來鍵值可以為空

2.外來鍵欄位必須得參照這張表中的主鍵嗎?

  • 外來鍵欄位參照一張表的欄位的時候,被參照的欄位必須具備唯一性
  • 即具有unique約束,不一定非是主鍵

3.班級表為父表,學生表為子表

  • 應該先建立父表,再建立子表
  • 刪除資料時,應該先刪除子表中的資料,再刪除父表中的資料
  • 插入資料時,應該先插入父表中的資料,再刪除子表中的資料

DROP TABLE IF EXISTS t_student;
DROP TABLE IF EXISTS t_class;
 
 CREATE TABLE t_class(
 cno INT(3) PRIMARY KEY,
 cname VARCHAR(128) NOT NULL UNIQUE
 );
 
 CREATE TABLE t_student(
 sno INT(3) PRIMARY KEY,
 sname VARCHAR(32) NOT NULL,
 classno INT(3),-- 外來鍵
 CONSTRAINT t_student_class_fk FOREIGN KEY(classno) REFERENCES t_class(cno)
 );
 
 INSERT INTO t_class(cno,cname) VALUES(100,'高三1班');
 INSERT INTO t_class(cno,cname) VALUES(200,'高三2班');
 INSERT INTO t_class(cno,cname) VALUES(300,'高三3班');
 
 INSERT INTO t_student(sno,sname,classno) VALUES(1,'jack',100);
 INSERT INTO t_student(sno,sname,classno) VALUES(2,'lucy',100);
 INSERT INTO t_student(sno,sname,classno) VALUES(3,'hh',100);
 INSERT INTO t_student(sno,sname,classno) VALUES(4,'frank',200); 
 INSERT INTO t_student(sno,sname,classno) VALUES(5,'smith',300);
 INSERT INTO t_student(sno,sname,classno) VALUES(6,'jhh',300);
 
 SELECT * FROM t_student;
 SELECT * FROM t_class;
 
-- 新增失敗,因為有外來鍵約束 
 INSERT INTO t_student(sno,sname,classno) VALUES(8,'kk',500);

重點:典型的一對多關係,設計時在多的一方加外來鍵

5. 級聯更新與級聯刪除

在刪除父表中的資料的時候,級聯刪除子表中的資料

在更新父表中的資料的時候,級聯更新子表中的資料

以上的級聯更新和級聯刪除謹慎使用,

因為級聯操作會使資料資料改變或刪除,資料是無價的。

語法:

  • 級聯更新:on update cascase
  • 級聯刪除:on delete cascase

MySQL中對於有些約束的修改比較麻煩,所以應該先刪除約束,再新增約束

刪除外來鍵約束:

alter table t_student drop foreign key t_student_class_fk

新增外來鍵約束並級聯更新:

alter table t_student add constraint t_student_class_fk foreign key(classno)
references t_class(no) on delete cascade;

新增外來鍵約束並級聯刪除:

alter table t_student add constraint t_student_class_fk foreign key(classno)
references t_class(no) on update cascade;

級聯刪除

級聯更新

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com