最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL CHECK約束(5.7和8.0)的使用

 更新時間:2024年08月04日 11:33:18   作者:zxrhhm  
CHECK約束用于確保數(shù)據(jù)表中的某列或多列的數(shù)據(jù)符合特定的條件,本文主要介紹了MySQL CHECK約束(5.7和8.0)的使用,具有一定的參考價值,感興趣的可以了解一下

在 MySQL 中,直到 MySQL 8.0.16 版本之前,標(biāo)準(zhǔn) SQL 的 CHECK 約束并未被完全支持。然而,從 MySQL 8.0.16 開始,CHECK 約束在表定義中得到了支持,允許你定義列中必須滿足的條件。

使用 CHECK 約束,你可以確保在插入或更新記錄時,某列或某組列的值滿足特定的條件。

以下是如何在 MySQL 中使用 CHECK 約束

1、MySQL5.7.X CHECK 約束

MySQL5.7.X CHECK 約束是無效的,只做檢查CHECK ,不強制CHECK

1.1、測試用例

在這個示例中,我們創(chuàng)建了一個名為 t_check 的表,其中有一個c_age 列。CHECK約束確保c_age 列的值在大于等于18。

select @@version 檢查MySQL版本信息

mysql> select @@version;
+------------+
| @@version  |
+------------+
| 5.7.28-log |
+------------+
1 row in set (0.00 sec)

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.7.28, for linux-glibc2.12 (x86_64) using  EditLine wrapper

Connection id:          2
Current database:       superdb
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.7.28-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /tmp/mysql.sock
Uptime:                 6 min 59 sec

Threads: 1  Questions: 18  Slow queries: 0  Opens: 111  Flush tables: 1  Open tables: 26  Queries per second avg: 0.042
--------------
create table t_check
( id int not null primary key,
  c_name varchar(32),
  c_age int check(c_age>=18)
);
-- insert 
mysql> insert into t_check values(1,'column_check_001',18);
Query OK, 1 row affected (0.04 sec)

mysql> insert into t_check values(2,'column_check_002',17);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_check values(3,'column_check_003',30);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_check;
+----+------------------+-------+
| id | c_name           | c_age |
+----+------------------+-------+
|  1 | column_check_001 |    18 |
|  2 | column_check_002 |    17 |
|  3 | column_check_003 |    30 |
+----+------------------+-------+
3 rows in set (0.00 sec)

2、MySQL8.X CHECK 約束

MySQL8.0.X check是有效的,做檢查CHECK ,強制CHECK

2.1、創(chuàng)建表t_check,插入滿足 CHECK 約束的數(shù)據(jù)

在這個示例中,我們創(chuàng)建了一個名為 t_check 的表,其中有一個c_age 列。CHECK約束確保c_age 列的值在大于等于18。

mysql> create table t_check
-> ( id int not null primary key,
->   c_name varchar(32),
->   c_age int check(c_age>=18)
-> );
Query OK, 0 rows affected (0.15 sec)
mysql> insert into t_check values(1,'column_check_001',18);
Query OK, 1 row affected (0.01 sec)

2.2、嘗試插入不滿足 CHECK 約束的數(shù)據(jù):

mysql> insert into t_check values(2,'column_check_002',17);
ERROR 3819 (HY000): Check constraint 't_check_chk_1' is violated.

2.3、插入滿足 CHECK 約束的數(shù)據(jù)

mysql> insert into t_check values(3,'column_check_003',30);
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.02 sec)
mysql> select * from t_check;
+----+------------------+-------+
| id | c_name           | c_age |
+----+------------------+-------+
|  1 | column_check_001 |    18 |
|  3 | column_check_003 |    30 |
+----+------------------+-------+
2 rows in set (0.00 sec)

2.4、給已經(jīng)創(chuàng)建好的表增加約束

create table t_check2
( id int not null primary key,
  c_name varchar(32),
  c_age int
);
alter table t_check2 add constraint check(c_age>=18);

insert into t_check2 values(1,'column_check_001',18);
insert into t_check2 values(2,'column_check_002',17);
insert into t_check2 values(3,'column_check_003',30);
commit;
select * from t_check2;

同上用例測試 MySQL8.0 ,check有效檢查并強制約束,執(zhí)行效果如下

mysql> insert into t_check2 values(2,'column_check_002',17);
ERROR 3819 (HY000): Check constraint 't_check2_chk_1' is violated.

3、約束的相關(guān)查詢及管理

3.1、8.0.X 視圖information_schema.CHECK_CONSTRAINTS

SELECT * FROM information_schema.CHECK_CONSTRAINTS ;

mysql> SELECT  * FROM  information_schema.CHECK_CONSTRAINTS ;  
+--------------------+-------------------+-----------------+-----------------+
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | CHECK_CLAUSE    |
+--------------------+-------------------+-----------------+-----------------+
| def                | db01              | t_check2_chk_1  | (`c_age` >= 18) |
+--------------------+-------------------+-----------------+-----------------+

select * from information_schema.TABLE_CONSTRAINTS
where CONSTRAINT_SCHEMA=‘superdb’
and TABLE_NAME=‘t_check2’;

mysql> select  * from  information_schema.TABLE_CONSTRAINTS
    -> where CONSTRAINT_SCHEMA='superdb'
    -> and TABLE_NAME='t_check2';
+--------------------+-------------------+-----------------+--------------+------------+-----------------+----------+
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | TABLE_SCHEMA | TABLE_NAME | CONSTRAINT_TYPE | ENFORCED |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+----------+
| def                | superdb           | PRIMARY         | superdb      | t_check2   | PRIMARY KEY     | YES      |
| def                | superdb           | t_check2_chk_1  | superdb      | t_check2   | CHECK           | YES      |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+----------+
2 rows in set (0.00 sec)

3.2、查看表的主鍵約束信息

select * from information_schema.KEY_COLUMN_USAGE kcu
where CONSTRAINT_SCHEMA=‘superdb’
and TABLE_NAME=‘t_check’;

mysql> select * from information_schema.KEY_COLUMN_USAGE kcu
    -> where  CONSTRAINT_SCHEMA='superdb'
    -> and  TABLE_NAME='t_check';
+--------------------+-------------------+-----------------+---------------+--------------+------------+-------------+------------------+-------------------------------+-------------------------+-----------------------+------------------------+
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | ORDINAL_POSITION | POSITION_IN_UNIQUE_CONSTRAINT | REFERENCED_TABLE_SCHEMA | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+--------------------+-------------------+-----------------+---------------+--------------+------------+-------------+------------------+-------------------------------+-------------------------+-----------------------+------------------------+
| def                | superdb           | PRIMARY         | def           | superdb      | t_check    | id          |                1 |                          NULL | NULL                    | NULL                  | NULL                   |
+--------------------+-------------------+-----------------+---------------+--------------+------------+-------------+------------------+-------------------------------+-------------------------+---

3.3、查看表的外鍵約束信息

select * from information_schema.REFERENTIAL_CONSTRAINTS rc
where CONSTRAINT_SCHEMA=‘superdb’
and TABLE_NAME=‘t_check’;

mysql> select  * from  information_schema.REFERENTIAL_CONSTRAINTS rc
    -> where CONSTRAINT_SCHEMA='superdb'
    -> and  TABLE_NAME='t_check';
Empty set (0.00 sec)
-- 因沒有外鍵約束,查出為空

4、 刪除 CHECK 約束:

要刪除一個 CHECK 約束,你需要知道它的名字(如果在創(chuàng)建時指定了的話)。但如果你沒有指定名字,你可能需要刪除整個表并重新創(chuàng)建它,或者使用其他方法(如觸發(fā)器)來模擬 CHECK 約束的行為。

mysql> alter table t_check2 drop constraint t_check2_chk_1;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

再次插入之前不滿足條件的數(shù)據(jù),則執(zhí)行成功

mysql> insert into t_check2 values(2,'column_check_002',17);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_check2;
+----+------------------+-------+
| id | c_name           | c_age |
+----+------------------+-------+
|  1 | column_check_001 |    18 |
|  2 | column_check_002 |    17 |
|  3 | column_check_003 |    30 |
+----+------------------+-------+
3 rows in set (0.00 sec)

5、在多個列上使用 CHECK 約束:

你也可以在多個列上使用 CHECK 約束,例如:

CREATE TABLE t_students (  
    id INT AUTO_INCREMENT PRIMARY KEY,  
    age INT,  
    grade CHAR(1),  
    CHECK (age >= 0 AND age <= 100),  
    CHECK (grade IN ('A', 'B', 'C', 'D', 'F'))  
);

在這個示例中,我們添加了一個額外的 CHECK 約束來確保 grade 列的值是 ‘A’、‘B’、‘C’、‘D’ 或 ‘F’ 中的一個。

到此這篇關(guān)于MySQL CHECK約束(5.7和8.0)的使用的文章就介紹到這了,更多相關(guān)MySQL CHECK約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySql中modify、rename、change的使用及區(qū)別

    MySql中modify、rename、change的使用及區(qū)別

    這篇文章主要介紹了MySql中modify、rename、change的使用及區(qū)別,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • mysql-joins具體用法說明

    mysql-joins具體用法說明

    這篇文章主要介紹了mysql-joins具體用法說明,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MySQL性能突然下降的原因

    MySQL性能突然下降的原因

    這篇文章主要介紹了MySQL性能突然下降的原因,幫助大家更好的了解和維護數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-10-10
  • MySQL數(shù)據(jù)庫學(xué)習(xí)之分組函數(shù)詳解

    MySQL數(shù)據(jù)庫學(xué)習(xí)之分組函數(shù)詳解

    這篇文章主要為大家詳細介紹一下MySQL數(shù)據(jù)庫中分組函數(shù)的使用,文中的示例代碼講解詳細,對我們學(xué)習(xí)MySQL有一定幫助,需要的可以參考一下
    2022-07-07
  • MySQL按天分組統(tǒng)計一定時間內(nèi)的數(shù)據(jù)實例(沒有數(shù)據(jù)補0)

    MySQL按天分組統(tǒng)計一定時間內(nèi)的數(shù)據(jù)實例(沒有數(shù)據(jù)補0)

    我們在用Mysql制作數(shù)據(jù)可視化圖表時候,經(jīng)常需要按照天對數(shù)據(jù)進行分組統(tǒng)計,下面這篇文章主要給大家介紹了關(guān)于MySQL按天分組統(tǒng)計一定時間內(nèi)的數(shù)據(jù),沒有數(shù)據(jù)補0的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • MySQL最基本的命令使用匯總

    MySQL最基本的命令使用匯總

    這篇文章為大家分享了MySQL最基本的命令使用匯總,MySQL最基本的命令使用,包括如何正確連接MySQL(和PHP搭配之最佳組合),修改密碼與增加新用戶等相關(guān)內(nèi)容的描述,感興趣的小伙伴們可以參考一下
    2015-11-11
  • mysql實現(xiàn)根據(jù)多個字段查找和置頂功能

    mysql實現(xiàn)根據(jù)多個字段查找和置頂功能

    在mysql中,如果要實現(xiàn)根據(jù)某個字段排序的時候,可以使用下面的SQL語句,下面為大家介紹下如何實現(xiàn)根據(jù)多個字段查找和置頂功能
    2013-11-11
  • Mysql四種分區(qū)方式以及組合分區(qū)落地實現(xiàn)詳解

    Mysql四種分區(qū)方式以及組合分區(qū)落地實現(xiàn)詳解

    對用戶來說,分區(qū)表是一個獨立的邏輯表,但是底層由多個物理子表組成,下面這篇文章主要給大家介紹了關(guān)于Mysql四種分區(qū)方式以及組合分區(qū)落地實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • mysql數(shù)據(jù)庫常見的優(yōu)化操作總結(jié)(經(jīng)驗分享)

    mysql數(shù)據(jù)庫常見的優(yōu)化操作總結(jié)(經(jīng)驗分享)

    這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫常見的優(yōu)化操作,文章總結(jié)的都是個人日常開發(fā)使用mysql數(shù)據(jù)庫的經(jīng)驗所得,其中包括Index索引、少用SELECT*、EXPLAIN SELECT以及開啟查詢緩存等相關(guān)資料,相信會對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • 詳解如何利用amoeba(變形蟲)實現(xiàn)mysql數(shù)據(jù)庫讀寫分離

    詳解如何利用amoeba(變形蟲)實現(xiàn)mysql數(shù)據(jù)庫讀寫分離

    這篇文章主要介紹了詳解如何利用amoeba(變形蟲)實現(xiàn)mysql數(shù)據(jù)庫讀寫分離,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評論

凌源市| 巴东县| 岳普湖县| 昭通市| 宁化县| 武胜县| 即墨市| 改则县| 乌海市| 兰西县| 黎平县| 千阳县| 保德县| 防城港市| 内乡县| 肥东县| 石门县| 河源市| 镇远县| 浦北县| 盐亭县| 犍为县| 桓台县| 绥阳县| 浮山县| 南溪县| 丰台区| 剑河县| 扎囊县| 磐安县| 瑞安市| 刚察县| 当涂县| 安吉县| 霍林郭勒市| 武宁县| 天镇县| 广昌县| 洪泽县| 阿图什市| 合水县|