欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

MySQL中常見(jiàn)的約束類型是什么

這篇文章給大家分享的是有關(guān)MySQL中常見(jiàn)的約束類型是什么的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

屏山網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,屏山網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為屏山上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的屏山做網(wǎng)站的公司定做!

約束的字面意思就是規(guī)定或者限制某個(gè)事該如何去做,在MySQL中,約束就是對(duì)數(shù)據(jù)表中數(shù)據(jù)指定規(guī)則,也就是對(duì)數(shù)據(jù)進(jìn)行限制,以此來(lái)確??煽啃?,比如不允許某列出現(xiàn)Null值,實(shí)際中我們會(huì)遇到以下類型的約束。

  • NOT NULL : 確保列不能有NULL值

  • CHECK : 確保列中的值滿足特定條件

  • UNIQUE : 確保一列中的所有值都不同

  • PRIMARY KEYNOT NULLUNIQUE組合,唯一標(biāo)識(shí)表中的每一行

  • FOREIGN KEY : 外鍵約束

  • DEFAULT : 如果未指定值,則為列設(shè)置默認(rèn)值

約束

1.NULL

MySQL中通過(guò)使用NOT NULL確保列中不會(huì)出現(xiàn)Null值,創(chuàng)建表時(shí)候格式如下:

mysql> create table user(name varchar(255)not null);
Query OK, 0 rows affected (0.06 sec)

如果試圖插入一個(gè)null值,則會(huì)拋出異常。

mysql> insert user values(null);
ERROR 1048 (23000): Column 'name' cannot be null

或者在現(xiàn)有表上新增NOT NULL約束。

mysql> alter table user modify name varchar(255) not null;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

刪除NOT NULL約束。

mysql> alter table user modify name varchar(255)  null;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

2.CHECK

如果想在列上定義條件約束,可以使用CHECK,比如下面,強(qiáng)制讓年齡字段大于18,小于80,否則將會(huì)報(bào)錯(cuò)。

mysql> create table user(age int(11) check(age>18 and age <80));
Query OK, 0 rows affected, 1 warning (0.06 sec)

插入測(cè)試,可以發(fā)現(xiàn)9、81在插入的時(shí)候拋出異常。

mysql> insert user values(9);
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.

mysql> insert user values(19);
Query OK, 1 row affected (0.01 sec)

mysql> insert user values(81);
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql>

也可以進(jìn)行多列約束,如年齡必須大于18,城市必須為中國(guó)。

mysql> create table user(age int(11),city varchar(255) ,check(age>18 and city='中國(guó)'));
Query OK, 0 rows affected, 1 warning (0.05 sec)

插入測(cè)試。

mysql> insert user values(81,'2');
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql> insert user values(8,'2');
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql> insert user values(20,'2');
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql> insert user values(20,'中國(guó)');
Query OK, 1 row affected (0.01 sec)

mysql> insert user values(20,'中國(guó)1');
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql> insert user values(85,'中國(guó)');
Query OK, 1 row affected (0.01 sec)

mysql> insert user values(9,'中國(guó)');
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.

還可以讓列值必須在指定集合中,如性別必須在男、女、未知、人妖集合中。

mysql> create table user(sex varchar(255) check (sex in ('男','女','未知','人妖')));
Query OK, 0 rows affected (0.05 sec)

插入測(cè)試。

mysql> insert user values("男");
Query OK, 1 row affected (0.02 sec)

mysql> insert user values("男男");
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql> insert user values("女");
Query OK, 1 row affected (0.01 sec)

mysql> insert user values("人妖");
Query OK, 1 row affected (0.00 sec)

為約束命名并刪除約束。

mysql> create table user (age int(11) ,constraint CHK_AGE check(age>18));
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> insert user values(5);
ERROR 3819 (HY000): Check constraint 'CHK_AGE' is violated.

mysql> alter table user drop check CHK_AGE;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> insert user values(5);
Query OK, 1 row affected (0.01 sec)

但是,這樣的寫(xiě)法你見(jiàn)過(guò)嗎?

猜猜下面的作用是什么。

這其實(shí)是一個(gè)case when條件判斷,讓其僅僅可以插入>=18,或者是在0-10之間的數(shù)。

CREATE TABLE `user` (`age` int(11) CHECK 
(((case when (`age` >=18) then 1 
else 
(case when age<10 and age >0 then 1 else 2 end) end) =1)));

3.UNIQUE

UNIQUE約束確保列中的沒(méi)有重復(fù)的值,UNIQUEPRIMARY KEY約束都為一列值的唯一性提供保障,但是UNIQUE每個(gè)表可以出現(xiàn)多次,而PRIMARY KEY只能出現(xiàn)一個(gè)。

如下面name字段不能重復(fù)。

mysql> create table user (name varchar(255),unique(name));
Query OK, 0 rows affected (0.07 sec)

插入測(cè)試。

mysql> insert user values("張三");
Query OK, 1 row affected (0.02 sec)

mysql> insert user values("張三");
ERROR 1062 (23000): Duplicate entry '張三' for key 'user.name'mysql>

對(duì)此約束進(jìn)行起名,并刪除。

mysql> create table user (name varchar(255),constraint name_un unique(name));
Query OK, 0 rows affected (0.07 sec)

mysql> insert user values("張三");
Query OK, 1 row affected (0.02 sec)

mysql> insert user values("張三");
ERROR 1062 (23000): Duplicate entry '張三' for key 'user.name_un'
mysql> alter table user drop index name_un;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert user values("張三");
Query OK, 1 row affected (0.02 sec)

插入后可以用以下語(yǔ)句查看創(chuàng)建語(yǔ)句。

mysql> show create table user;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `name` varchar(255) DEFAULT NULL,
  UNIQUE KEY `name_un` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

要?jiǎng)h除UNIQUE約束,可以使用DROP INDEXALTER TABLE語(yǔ)句:

mysql> DROP INDEX name_un ON user;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table user;
+-------+-----------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                |
+-------+-----------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+-----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

在現(xiàn)有表上添加。

mysql> alter table user add constraint name_un unique(name);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

4.PRIMARY KEY

通常每個(gè)表中包含一個(gè)用于唯一標(biāo)識(shí)每一行的值,這個(gè)列就被稱為PRIMARY KEY。

mysql> create table user (id int(11) ,age int(11),primary key (id));
Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> insert user values(1,2);
Query OK, 1 row affected (0.02 sec)

mysql> insert user values(1,2);
ERROR 1062 (23000): Duplicate entry '1' for key 'user.PRIMARY'mysql>

5.FOREIGN KEY

FOREIGN KEY用于約束表中的一個(gè)字段必須是另一個(gè)表中某個(gè)字段所存在的值,但是在另一個(gè)表中,這個(gè)列不一定是主鍵,但必須是唯一性索引,否則會(huì)創(chuàng)建失敗。

比如orders表中的userId必須參考user表中的id,如果插入的userId在user表中不存在,則無(wú)法插入。

mysql> create table orders (id int(11) primary key ,userId int(11) ,  FOREIGN KEY (userId) REFERENCES user(id) );
Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> insert orders values(1,3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`t`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `user` (`id`))

mysql> insert orders values(1,1);
Query OK, 1 row affected (0.01 sec)

但是存在一個(gè)問(wèn)題,如果主表(user)中記錄被刪除或者更新,那orders中的記錄該怎么辦?,如下面的例子,可以發(fā)現(xiàn)直接報(bào)錯(cuò)了。

mysql> update user set id =2 where id =1;

Cannot delete or update a parent row: a foreign key constraint fails (`t`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `user` (`id`)

MySQL提供了幾個(gè)約束可以幫助我們解決這類問(wèn)題,比如在user表更新時(shí),orders也相繼更新。

  1. RESTRICT:如果子表中有記錄,則拒絕更新或刪除父表中的記錄。

  2. CASCADE:更新或刪除父表中的記錄時(shí),自動(dòng)更新或刪除子表中的記錄。

  3. SET NULL:在更新或刪除父表記錄時(shí),將子表中字段的值設(shè)置為空。

可以發(fā)現(xiàn),默認(rèn)采用的是RESTRICT,下面來(lái)修改一下,讓在更新時(shí)候也同樣更新,在刪除時(shí)候設(shè)置null。

mysql> alter table orders add constraint orders_ibfk_1  FOREIGN KEY (`userId`) REFERENCES `user` (`id`) on update cascade on
delete set null;
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0

測(cè)試更新

mysql> select * from user;
+----+--------+
| id | name   |
+----+--------+
|  1 | 張三   |
+----+--------+
1 row in set (0.00 sec)

mysql> select * from orders;
Empty set (0.00 sec)

mysql> insert orders values (1,1);
Query OK, 1 row affected (0.01 sec)

mysql> update user set id =2 where id =1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from orders;
+----+--------+
| id | userId |
+----+--------+
|  1 |      2 |
+----+--------+
1 row in set (0.01 sec)

測(cè)試刪除。

mysql> delete from user where id =2;
Query OK, 1 row affected (0.02 sec)

mysql> select * from orders;
+----+--------+
| id | userId |
+----+--------+
|  1 |   NULL |
+----+--------+
1 row in set (0.00 sec)

6.DEFAULT

DEFAULT約束用于為列設(shè)置默認(rèn)值,如果沒(méi)有為某個(gè)字段賦值,系統(tǒng)就會(huì)自動(dòng)為這個(gè)字段插入默認(rèn)值,沒(méi)有賦值指的是在insert插入數(shù)據(jù)時(shí)沒(méi)有指明這個(gè)字段,如果指定null值,最終存放的還是null值。

mysql> create table user(age int(11) default 18);
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> insert user values();
Query OK, 1 row affected (0.02 sec)

mysql> select * from user;
+------+
| age  |
+------+
|   18 |
+------+
1 row in set (0.00 sec)

感謝各位的閱讀!關(guān)于“MySQL中常見(jiàn)的約束類型是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

文章名稱:MySQL中常見(jiàn)的約束類型是什么
網(wǎng)站網(wǎng)址:http://aaarwkj.com/article26/pcddjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)公司用戶體驗(yàn)、App設(shè)計(jì)、服務(wù)器托管、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
白白色成人在线免费视频| 男女性情视频免费大全网站| 亚洲久久精品中文字幕| 人妻少妇麻豆中文字幕久久精品| 久久综激情丁香开心婷婷| 中文字幕女同系列av厨房| 精品视频偷拍一区二区三区| 一区二区三区日韩激情| 天堂av五月在线观看| 熟妇丰满多毛的大阴户| 国精品午夜福利视频不卡| 97视频在线视频免费| 亚洲av香蕉综合一区| 国内丰满少妇嗷嗷叫在线播放| 高清国产在线播放91| 色哟国产传媒视频在线观看| 日韩亚洲av在线免费观看| 欧美亚洲另类在线第一页| 日本国产在线一区二区| 亚洲综合偷拍日韩av| 美女爽到高潮久久久| 国产麻豆剧传媒精品av| 成年人三级黄色片视频| 男女视频一区二区三区在线观看| 丝袜美腿美女日韩在线| 91人妻这里只有精品| 精品国产一区二区三区精品日韩| 伊人蕉影院久亚洲高清| 成年人片免费在线观看| 久久国产亚洲欧美一区| 欧美精品亚洲精品日韩| 亚洲中文字幕婷婷在线| 成人一区二区三区乱码| 视频一区欧美日韩精品| 久久婷婷欧美激情综合| 美女诱惑丝袜国产国产av丝袜| 精品国产品国语在线不卡| 欧美日韩一区二区三区色拉拉| 99精品欧美一区二区三区视频| 中文字幕国产精品一二区| 国产成人一区二区三区综合区|