<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
資料庫的約束就是關係型資料庫給我們提供的一種"校驗資料"合法性的機制
建立表時,可以指定某列不為空
create table student( id int not null, sn int, name varchar(20), qq_mail varchar(20) ); mysql> desc student; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | sn | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | qq_mail | varchar(20) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
保證某列的每行必須有唯一的值
重新設定一下表的結構
create table student1( id int not null, sn int unique, name varchar(20), qq_mail varchar(20) ); mysql> desc student1; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | sn | int(11) | YES | UNI | NULL | | | name | varchar(20) | YES | | NULL | | | qq_mail | varchar(20) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
表示sn這列的值時唯一的不重複的
規定沒有給列賦值時的預設值
指定插入資料時,name列為空,預設值unkown
create table student2( id int not null, sn int unique, name varchar(20) default 'unkown', qq_mail varchar(20) ); mysql> desc student2; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | sn | int(11) | YES | UNI | NULL | | | name | varchar(20) | YES | | unkown | | | qq_mail | varchar(20) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
插入一個id但不插入name時:
insert into student2 (id) values (1); mysql> select*from student2; +----+------+--------+---------+ | id | sn | name | qq_mail | +----+------+--------+---------+ | 1 | NULL | unkown | NULL | +----+------+--------+---------+ 1 row in set (0.00 sec)
name是預設值
NOT NULL 和 UNIQUE 的結合
確保某列有唯一標識,有助於快速找到表中的一個特定記錄
create table student3( id int not null primary key, sn int unique, name varchar(20) default 'unkown', qq_mail varchar(20) ); mysql> desc student3; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | sn | int(11) | YES | UNI | NULL | | | name | varchar(20) | YES | | unkown | | | qq_mail | varchar(20) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
主鍵是not null 和 unique 的結合,也可以不用 not null
id int primary key
對於整數型別的主鍵,例如id,常搭配自增長auto_increment來使用
當插入資料對應欄位不給定值時,使用最大值加一
mysql> create table student4( id int primary key auto_increment, sn int unique, name varchar(20) default 'unkown', qq_mail varchar(20) );
接下來我們插入記錄時,id為null
mysql> insert into student4 values (null,1000,'zhangsan',null); Query OK, 1 row affected (0.00 sec) mysql> insert into student4 values (null,1001,'zhangsi',null); Query OK, 1 row affected (0.00 sec) //將id置為100 insert into student4 values(100,1002,'zhangwu',null); //將id置為null insert into student4 values(null,1003,'zhangliu',null); 結果 mysql> select *from student4; +-----+------+----------+---------+ | id | sn | name | qq_mail | +-----+------+----------+---------+ | 1 | 1000 | zhangsan | NULL | | 2 | 1001 | zhangsi | NULL | | 100 | 1002 | zhangwu | NULL | | 101 | 1003 | zhangliu | NULL | +-----+------+----------+---------+ 4 rows in set (0.00 sec)
可以看出,使用自增長之後,插入資料給值時,用給定的值插入,插入資料不給值時,預設插入最近一次的最大值+1
保證一個表中的資料匹配另一個表中的值的參照完整性
建立一個班級表class,id為主鍵.
建立學生表student,一個學生對應一個班級,一個班級對應多個學生。使用id為主鍵, classes_id為外來鍵,關聯班級表id
create table class( id int primary key, name varchar(20), `desc` VARCHAR(100) ); Query OK, 0 rows affected (0.03 sec) mysql> desc class; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | desc | varchar(100) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
create table student5( id int primary key auto_increment, sn int unique,name varchar(20) default 'unknow', qq_mail varchar(20), class_id int, foreign key(class_id) references class(id) ); Query OK, 0 rows affected (0.03 sec) mysql> desc student5; +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | sn | int(11) | YES | UNI | NULL | | | name | varchar(20) | YES | | unknow | | | qq_mail | varchar(20) | YES | | NULL | | | class_id | int(11) | YES | MUL | NULL | | +----------+-------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
此時學生表就和班級表關聯起來了
外來鍵約束是兩個表之間的相互約束
我們插入一個非法資料,現在class的id列還是空的,插任何資料都會不合法
insert into student5 values(1,1001,'張三',null,10); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`java_3`.`student5`, CONSTRAINT `student5_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
插入失敗,因為class的id列沒有10這個資料
說明學生表中的資料依賴於班級表的資料,班級表的資料對學生表的資料產生約束力,班級表為父表,學生表為子表
我們先給班級表和學生表插入資料
mysql> insert into class values(1,'java001',null); Query OK, 1 row affected (0.00 sec) mysql> insert into student5 values(1,1001,'張三',null,1); Query OK, 1 row affected (0.00 sec) mysql> select*from class; +----+---------+------+ | id | name | desc | +----+---------+------+ | 1 | java001 | NULL | +----+---------+------+ 1 row in set (0.00 sec) mysql> select*from student5; +----+------+------+---------+----------+ | id | sn | name | qq_mail | class_id | +----+------+------+---------+----------+ | 1 | 1001 | 張三 | NULL | 1 | +----+------+------+---------+----------+ 1 row in set (0.00 sec)
因為資料都是合法的,所以成功插入
下面舉例說明子表也會反過來約束父表
mysql> delete from class where id = 1; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`java_3`.`student5`, CONSTRAINT `student5_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
當我們刪除班級表中的資料時,發現刪除失敗
原因是班級表的資料被學生表給參照了,如果刪除成功,那麼子表的資料就沒有意義了
因此父表的資料被參照時,是不能刪除的,如果要刪除,就先刪除子表後刪除父表
到此這篇關於MySQL資料庫的約束使用範例的文章就介紹到這了,更多相關MySQL資料庫的約束內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45