mysql约束深入了解_MySQL 的约束
約束是添加在列上, 用來約束列的!
1. 主鍵約束(表中的某行的唯一標(biāo)識)
主鍵的特點:
非空
唯一
被引用
創(chuàng)建表時, 指定主鍵的兩種方式:
// 需求: 指定 sid 列為主鍵列, 即為 sid 列添加主鍵約束
// 第一種方式:
CREATE TABLE stu(
sid CHAR(6) PRIMARY KEY,
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
);
// 第二種方式:
CREATE TABLE stu(
sid CHAR(6),
sname VARCHAR(20),
age INT,
gender VARCHAR(10),
PRIMARY KEY(sid)
);
修改表時,指定主鍵: ALTER TABLE stu ADD PRIMARY KEY(sid);
刪除主鍵: ALTER TABLE stu DROP PRIMARY KEY;
2. 主鍵自增長
因為主鍵列的特性是: 必須唯一, 不能為空, 所以我們通常會指定主鍵類型為整型, 然后設(shè)置其自動增長,
這樣可以保證在插入數(shù)據(jù)時, 主鍵列的唯一和非空特性.
創(chuàng)建表時,指定主鍵自增長
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
);
修改表時, 設(shè)置主鍵自增長: ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
修改表時, 刪除主鍵自增長: ALTER TABLE stu CHANGE sid sid INT;
3. 非空約束
因為某些列不能設(shè)置為 NULL 值, 所以可以對列添加非空約束.
// 示例: 對 sname 列設(shè)置非空約束
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL,
age INT,
gender VARCHAR(20)
);
4. 唯一約束
數(shù)據(jù)庫某些值不能設(shè)置重復(fù)的值, 所以可以對列添加唯一約束.
// 示例: 對 sname 列設(shè)置唯一約束
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) UNIQUE,
age INT,
gender VARCHAR(20)
);
5. 概念模型
當(dāng)我們要完成一個軟件體統(tǒng)時, 需要把系統(tǒng)中的實體抽取出來, 形成概念模型.
例如部門, 員工都是系統(tǒng)中的實體. 概念模型中的實體最終都會稱為 JAVA 中的 domain類(對象模型), 數(shù)據(jù)庫中的表(關(guān)系模型).
5.1 實體之間的關(guān)系有三種:
1 對多: 例如每個員工都從屬一個部門, 而一個部門可以有多個員工, 其中員工是多方, 而部門是一方;
1 對 1 : 例如老公和老婆就是一對一的關(guān)系.(不常見)
多對多 : 老師和學(xué)生的關(guān)系就是多對多, 一個老師可以有多個學(xué)生, 一個學(xué)生可以有多個老師.
5.2 對象模型和關(guān)系模型
對象模型(Java 中的類): 可以雙向關(guān)聯(lián), 而且引用的是對象, 而不是一個主鍵!
關(guān)系模型(數(shù)據(jù)庫中的表): 只能多方引用一方, 而且引用的只是主鍵, 而不是一整行記錄.
java 中的類,使用成員變量來完成關(guān)系, 一般都是雙向關(guān)聯(lián)!!
// 實體之間的關(guān)系, java 代碼體現(xiàn)
// 多對一關(guān)系:
class Employee{ // 多方關(guān)聯(lián)一方, 即員工關(guān)聯(lián)部門
...
private Department department;
}
class Department{ // 一方關(guān)聯(lián)多方, 即部門關(guān)聯(lián)員工
...
private List employee;
}
// 多對多
class Student{ // 學(xué)生關(guān)聯(lián)老師
...
private List teacher;
}
class Teacher{
...
private List student;
}
6. 外鍵約束
外鍵特點:
外鍵必須是另一張表的主鍵的值(即外鍵要引用主鍵)
外鍵可以重復(fù)
外鍵可以為空
一張表中可以有多個外鍵!!
創(chuàng)建表時, 指定外鍵約束:
CREATE TABLE emp(
empno INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(50),
dno INT,
CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno)
)
// fk_emp_dept : 約束名稱
// fk, 表示 foreign key;
// emp, 表示從表, 即多方;
// dept, 表示主表, 即一方
// dno: 表示本表中作為外鍵的列
// dept(deptno): 表示引用的是 dept表的 deptno列
修改表時, 添加外鍵約束:
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno);
修改表時, 刪除外鍵約束:
ALTER TABLE emp DROP FOREIGN KEY fk_emp_deptno;
7. 數(shù)據(jù)庫中一對一關(guān)系
// 在表中建立一對一關(guān)系比較特殊, 需要讓從表的主鍵, 也是外鍵.
CREATE TABLE husband(
hid INT PRIMARY KEY,
...
);
CREATE TABLE wife(
wid INT PRIMARY KEY,
...
CONSTRAINT fk_wife_hid FOREIGN KEY(wid) REFERENCES husband(hid)
);
/*
* 其中, wife 表的 wid 鍵既是主鍵,又是相對 husband 表的外鍵!
* husband.hid 是主鍵, 不能重復(fù)!
* wife.wid 是主鍵,不能重復(fù), 又是外鍵, 必須來自 husband.hid.
* 所以如果 wife 表中有一條記錄的 wid 為 1, 那么 wife 表中的其他記錄的 wid 就不能再是1了,因為它是主鍵.
* 同時, 在 husband.hid 中必須存在 1 這個值, 因為 wid 是外鍵, 這就完成了一對一關(guān)系.
*/
8. 數(shù)據(jù)庫中多對多關(guān)系
在表中建立多對多關(guān)系需要使用中間表, 即需要三張表, 在中間表中使用兩個外鍵, 分別引用其他兩個表的主鍵.
CREATE TABLE student( // 學(xué)生表
sid INT PRIMARY KEY,
...
);
CREATE TABLE teacher( // 教師表
tid INT PRIMARY KEY,
...
);
CREATE TABLE stu_tea(
sid INT,
tid INT,
CONSTRAINT fk_student FOREIGN KEY(sid) REFERENCES student(sid),
CONSTRAINT fk_teacher FOREIGN KEY(tid) REFERENCES teacher(tid)
);
// 這時, 在 stu_tea 這個中間表中的每條記錄都是說明 student 和 teacher 表的關(guān)系.
// 例如, stu_tea 表中的記錄: sid 為100, tid 為 201, 說明編號為 100 的學(xué)生有一個編號為 201 的老師.
參考資料:
總結(jié)
以上是生活随笔為你收集整理的mysql约束深入了解_MySQL 的约束的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想g490at怎么样 2GB独显搭载的
- 下一篇: mybatis mysql usegen