亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL約束(創(chuàng)建表時(shí)的各種條件說明)

 更新時(shí)間:2022年06月21日 10:03:49   作者:Do?My?Love  
這篇文章主要介紹了MySQL約束(創(chuàng)建表時(shí)的各種條件說明),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

由于增刪改了emp表中的記錄,因此這里重新創(chuàng)建了一個(gè)腳本并使用

create database bjpowernnode;
use bjpowernode;
source C:\Users\Administrator\Desktop\bjpowernode.sql;

約束

1.什么是約束?

  • 約束就是表中的限制條件
  • 約束的關(guān)鍵字是:constraint

2. 約束的分類

  • 非空約束     not null
  • 唯一性約束   unique
  • 主鍵約束     primary key
  • 外鍵約束     foreign key
  • 檢查約束     MySQL數(shù)據(jù)庫不支持,Oracle數(shù)據(jù)庫支持

1. not null(非空約束)

not null約束的字段,不能為null值,必須給具體的數(shù)據(jù)

創(chuàng)建表,給字段添加 非空約束【用戶的郵箱地址不能為空】

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

2. unique(唯一性約束)

創(chuàng)建表,保證郵箱地址唯一

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

unique約束的字段不能重復(fù),但是可以為null

以上的約束屬于列級(jí)約束

表級(jí)約束:

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

 1.使用表級(jí)約束給多個(gè)字段添加約束

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

2.表級(jí)約束可以給約束起名,以后通過這個(gè)名字來刪除約束

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

not null 和unique可以聯(lián)合使用

3. primary key (主鍵約束)

1.主鍵涉及到的術(shù)語:

  • 主鍵約束
  • 主鍵字段
  • 主鍵值

2.以上三者之間的關(guān)系:

  • 表中的某個(gè)字段添加主鍵約束之后,該字段稱為主鍵字段
  • 主鍵字段中出現(xiàn)的每一個(gè)數(shù)據(jù)都被稱為主鍵值

3.給某個(gè)字段添加主鍵約束以后,該字段不能重復(fù),也不能為空

  • 主鍵約束效果和''not null unique'' 相同,但是本質(zhì)不同,
  • 主鍵約束除了可以做到''not null unique''之外
  • 主鍵字段還會(huì)默認(rèn)添加''索引-index''

4. 一張表應(yīng)給有主鍵字段,如果沒有,表示這張表是無效的

  • 主鍵值是當(dāng)前行數(shù)據(jù)的唯一標(biāo)識(shí)
  • 主鍵值是當(dāng)前行數(shù)據(jù)的身份證號(hào)碼
  • 即使表中的兩行記錄數(shù)據(jù)是完全相同的,
  • 但是由于主鍵值不同,就認(rèn)為這是兩行完全不同的字段

5.無論是單一主鍵還是復(fù)合主鍵,一張表的主鍵約束只能有一個(gè)

  • 給一個(gè)字段添加主鍵約束,被稱為單一主鍵約束
  • 給多個(gè)字段聯(lián)合添加主鍵約束,被稱為復(fù)合主鍵

6.主鍵根據(jù)性質(zhì)分類:

  • 自然主鍵:主鍵值是一個(gè)自然數(shù),這個(gè)主鍵和當(dāng)前的業(yè)務(wù)沒有關(guān)系
  • 業(yè)務(wù)主鍵:主鍵值和當(dāng)前業(yè)務(wù)緊密相關(guān)
  • 當(dāng)業(yè)務(wù)發(fā)生改變的時(shí)候,主鍵值通成會(huì)受到影響,所以業(yè)務(wù)主鍵之用很少。

單一主鍵,列級(jí)約束

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)
);

復(fù)合主鍵:只能用表級(jí)約束

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

auto_increment:主鍵自增

MySQL數(shù)據(jù)管理系統(tǒng)中提供了一個(gè)自增的數(shù)字,專門用來自動(dòng)生成主鍵值

主鍵值不需要用戶維護(hù),也不需要用戶提供了,自動(dòng)生成的,

這個(gè)自增的數(shù)字默認(rèn)從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.外鍵約束涉及到的術(shù)語:

  • 外鍵約束
  • 外鍵值
  • 外鍵字段

2.以上三者之間的關(guān)系:

  • 某個(gè)字段添加外鍵約束以后稱為外鍵字段
  • 外鍵字段中的每一個(gè)數(shù)據(jù)稱為外鍵值

3.外鍵分為單一外鍵和復(fù)合外鍵

  • 單一外鍵:給一個(gè)字段添加外鍵約束
  • 復(fù)合外鍵:給多個(gè)字段添加外鍵約束

4.一張表中可以有多個(gè)外鍵字段

設(shè)計(jì)一個(gè)數(shù)據(jù)庫表,用來存儲(chǔ)學(xué)生和班級(jí)信息,給出兩種解決方案:

學(xué)生信息和班級(jí)信息之間的關(guān)系:一個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生,這是典型的一對(duì)多的關(guān)系

在多的一方加外鍵

第一種設(shè)計(jì)方案:將學(xué)生信息和班級(jí)信息存儲(chǔ)到一張表中

第二種設(shè)計(jì)方案:將學(xué)生信息和班級(jí)信息分開兩張表存儲(chǔ),學(xué)生表+班級(jí)表

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

為了保證t_student 表中的classno字段中的數(shù)據(jù)必須來自于t_class表中的cno字段中的數(shù)據(jù),有必要給t_student表中的classno字段添加外鍵約束,classno稱為外鍵字段,該字段中的值稱為外鍵值。

注意:

1.外鍵值可以為空

2.外鍵字段必須得引用這張表中的主鍵嗎?

  • 外鍵字段引用一張表的字段的時(shí)候,被引用的字段必須具備唯一性
  • 即具有unique約束,不一定非是主鍵

3.班級(jí)表為父表,學(xué)生表為子表

  • 應(yīng)該先創(chuàng)建父表,再創(chuàng)建子表
  • 刪除數(shù)據(jù)時(shí),應(yīng)該先刪除子表中的數(shù)據(jù),再刪除父表中的數(shù)據(jù)
  • 插入數(shù)據(jù)時(shí),應(yīng)該先插入父表中的數(shù)據(jù),再刪除子表中的數(shù)據(jù)

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;
 
-- 添加失敗,因?yàn)橛型怄I約束 
 INSERT INTO t_student(sno,sname,classno) VALUES(8,'kk',500);

重點(diǎn):典型的一對(duì)多關(guān)系,設(shè)計(jì)時(shí)在多的一方加外鍵

5. 級(jí)聯(lián)更新與級(jí)聯(lián)刪除

在刪除父表中的數(shù)據(jù)的時(shí)候,級(jí)聯(lián)刪除子表中的數(shù)據(jù)

在更新父表中的數(shù)據(jù)的時(shí)候,級(jí)聯(lián)更新子表中的數(shù)據(jù)

以上的級(jí)聯(lián)更新和級(jí)聯(lián)刪除謹(jǐn)慎使用,

因?yàn)榧?jí)聯(lián)操作會(huì)使數(shù)據(jù)數(shù)據(jù)改變或刪除,數(shù)據(jù)是無價(jià)的。

語法:

  • 級(jí)聯(lián)更新:on update cascase
  • 級(jí)聯(lián)刪除:on delete cascase

MySQL中對(duì)于有些約束的修改比較麻煩,所以應(yīng)該先刪除約束,再添加約束

刪除外鍵約束:

alter table t_student drop foreign key t_student_class_fk

添加外鍵約束并級(jí)聯(lián)更新:

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

添加外鍵約束并級(jí)聯(lián)刪除:

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

級(jí)聯(lián)刪除

級(jí)聯(lián)更新

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL解決Navicat設(shè)置默認(rèn)字符串時(shí)的報(bào)錯(cuò)問題

    MySQL解決Navicat設(shè)置默認(rèn)字符串時(shí)的報(bào)錯(cuò)問題

    本文主要介紹了MySQL解決Navicat設(shè)置默認(rèn)字符串時(shí)的報(bào)錯(cuò),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • MySQL的邏輯架構(gòu)及工作全流程

    MySQL的邏輯架構(gòu)及工作全流程

    這篇文章主要介紹了MySQL的邏輯架構(gòu)及工作全流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 安裝配置Zabbix來監(jiān)控MySQL的基本教程

    安裝配置Zabbix來監(jiān)控MySQL的基本教程

    這篇文章主要介紹了安裝配置Zabbix來監(jiān)控MySQL的基本教程,Zabbix擁有web頁面端顯示數(shù)據(jù)的功能,文中的安裝環(huán)境為CentOS系統(tǒng),需要的朋友可以參考下
    2015-12-12
  • MySQL給字符串加一個(gè)高效索引的實(shí)現(xiàn)

    MySQL給字符串加一個(gè)高效索引的實(shí)現(xiàn)

    本文主要介紹了MySQL給字符串加一個(gè)高效索引的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Mysql復(fù)制表結(jié)構(gòu)、表數(shù)據(jù)的方法

    Mysql復(fù)制表結(jié)構(gòu)、表數(shù)據(jù)的方法

    這篇文章主要介紹了Mysql復(fù)制表結(jié)構(gòu)、表數(shù)據(jù)的方法,需要的朋友可以參考下
    2015-10-10
  • MySQL CHAR和VARCHAR該如何選擇

    MySQL CHAR和VARCHAR該如何選擇

    MySQL 支持字符串的數(shù)據(jù)類型并不多,但是卻有多種變化形式。MySQL 5.0以后更是支持每一列字符串可以有自己的字符集以及排序規(guī)則,這使得數(shù)據(jù)表設(shè)計(jì)更為復(fù)雜。本篇介紹字符類型的數(shù)據(jù)表字段 CHAR 和 VARCHAR 該如何選擇。
    2021-05-05
  • mysql sql語句性能調(diào)優(yōu)簡單實(shí)例

    mysql sql語句性能調(diào)優(yōu)簡單實(shí)例

    這篇文章主要介紹了 mysql sql語句性能調(diào)優(yōu)簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • MySQL數(shù)據(jù)庫基本SQL語句教程之高級(jí)操作

    MySQL數(shù)據(jù)庫基本SQL語句教程之高級(jí)操作

    對(duì)MySQL數(shù)據(jù)庫的查詢,除了基本的查詢外,有時(shí)候需要對(duì)查詢的結(jié)果集進(jìn)行處理,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫基本SQL語句教程之高級(jí)操作的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • mysql修復(fù)數(shù)據(jù)表的命令方法

    mysql修復(fù)數(shù)據(jù)表的命令方法

    網(wǎng)站運(yùn)行中mysql的數(shù)據(jù)表難免會(huì)出現(xiàn)類似"is marked as crashed and should be repaired"的錯(cuò)誤,我們可以用下面這個(gè)命令修復(fù)
    2014-02-02
  • mysql聲明游標(biāo)的方法

    mysql聲明游標(biāo)的方法

    在本篇文章里小編給大家整理的是關(guān)于mysql聲明游標(biāo)的方法和實(shí)例內(nèi)容,需要的朋友們可以參考下。
    2020-09-09

最新評(píng)論